diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4c2ec0791..879da94a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,7 +37,10 @@ jobs: - name: Checkout code uses: actions/checkout@v1 - name: Run tests - run: go test ./... + run: | + # separate test to avoid RESET MASTER conflict + go test $(go list ./... | grep -v canal) + go test $(go list ./... | grep canal) golangci: name: golangci diff --git a/canal/canal_test.go b/canal/canal_test.go index 80f463d2b..744058192 100644 --- a/canal/canal_test.go +++ b/canal/canal_test.go @@ -5,25 +5,24 @@ import ( "testing" "time" - . "github.com/pingcap/check" - "github.com/pingcap/errors" "github.com/pingcap/tidb/parser" "github.com/siddontang/go-log/log" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "github.com/go-mysql-org/go-mysql/mysql" "github.com/go-mysql-org/go-mysql/replication" "github.com/go-mysql-org/go-mysql/test_util" ) -func Test(t *testing.T) { - TestingT(t) -} - type canalTestSuite struct { + suite.Suite c *Canal } -var _ = Suite(&canalTestSuite{}) +func TestCanalSuite(t *testing.T) { + suite.Run(t, new(canalTestSuite)) +} const ( miA = 0 @@ -35,7 +34,7 @@ const ( umiC = 16777215 ) -func (s *canalTestSuite) SetUpSuite(c *C) { +func (s *canalTestSuite) SetupSuite() { cfg := NewDefaultConfig() cfg.Addr = fmt.Sprintf("%s:%s", *test_util.MysqlHost, *test_util.MysqlPort) cfg.User = "root" @@ -55,8 +54,8 @@ func (s *canalTestSuite) SetUpSuite(c *C) { var err error s.c, err = NewCanal(cfg) - c.Assert(err, IsNil) - s.execute(c, "DROP TABLE IF EXISTS test.canal_test") + require.NoError(s.T(), err) + s.execute("DROP TABLE IF EXISTS test.canal_test") sql := ` CREATE TABLE IF NOT EXISTS test.canal_test ( id int AUTO_INCREMENT, @@ -68,28 +67,28 @@ func (s *canalTestSuite) SetUpSuite(c *C) { )ENGINE=innodb; ` - s.execute(c, sql) + s.execute(sql) - s.execute(c, "DELETE FROM test.canal_test") - s.execute(c, "INSERT INTO test.canal_test (content, name, mi, umi) VALUES (?, ?, ?, ?), (?, ?, ?, ?), (?, ?, ?, ?)", + s.execute("DELETE FROM test.canal_test") + s.execute("INSERT INTO test.canal_test (content, name, mi, umi) VALUES (?, ?, ?, ?), (?, ?, ?, ?), (?, ?, ?, ?)", "1", "a", miA, umiA, `\0\ndsfasdf`, "b", miC, umiC, "", "c", miB, umiB, ) - s.execute(c, "SET GLOBAL binlog_format = 'ROW'") + s.execute("SET GLOBAL binlog_format = 'ROW'") - s.c.SetEventHandler(&testEventHandler{c: c}) + s.c.SetEventHandler(&testEventHandler{}) go func() { set, _ := mysql.ParseGTIDSet("mysql", "") err = s.c.StartFromGTID(set) - c.Assert(err, IsNil) + require.NoError(s.T(), err) }() } -func (s *canalTestSuite) TearDownSuite(c *C) { +func (s *canalTestSuite) TearDownSuite() { // To test the heartbeat and read timeout,so need to sleep 1 seconds without data transmission - c.Logf("Start testing the heartbeat and read timeout") + s.T().Logf("Start testing the heartbeat and read timeout") time.Sleep(time.Second) if s.c != nil { @@ -98,15 +97,14 @@ func (s *canalTestSuite) TearDownSuite(c *C) { } } -func (s *canalTestSuite) execute(c *C, query string, args ...interface{}) *mysql.Result { +func (s *canalTestSuite) execute(query string, args ...interface{}) *mysql.Result { r, err := s.c.Execute(query, args...) - c.Assert(err, IsNil) + require.NoError(s.T(), err) return r } type testEventHandler struct { DummyEventHandler - c *C } func (h *testEventHandler) OnRow(e *RowsEvent) error { @@ -122,45 +120,41 @@ func (h *testEventHandler) String() string { return "testEventHandler" } -func (h *testEventHandler) OnPosSynced(header *replication.EventHeader, p mysql.Position, set mysql.GTIDSet, f bool) error { - return nil -} - -func (s *canalTestSuite) TestCanal(c *C) { +func (s *canalTestSuite) TestCanal() { <-s.c.WaitDumpDone() for i := 1; i < 10; i++ { - s.execute(c, "INSERT INTO test.canal_test (name) VALUES (?)", fmt.Sprintf("%d", i)) + s.execute("INSERT INTO test.canal_test (name) VALUES (?)", fmt.Sprintf("%d", i)) } - s.execute(c, "INSERT INTO test.canal_test (mi,umi) VALUES (?,?), (?,?), (?,?)", + s.execute("INSERT INTO test.canal_test (mi,umi) VALUES (?,?), (?,?), (?,?)", miA, umiA, miC, umiC, miB, umiB, ) - s.execute(c, "ALTER TABLE test.canal_test ADD `age` INT(5) NOT NULL AFTER `name`") - s.execute(c, "INSERT INTO test.canal_test (name,age) VALUES (?,?)", "d", "18") + s.execute("ALTER TABLE test.canal_test ADD `age` INT(5) NOT NULL AFTER `name`") + s.execute("INSERT INTO test.canal_test (name,age) VALUES (?,?)", "d", "18") err := s.c.CatchMasterPos(10 * time.Second) - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *canalTestSuite) TestCanalFilter(c *C) { +func (s *canalTestSuite) TestCanalFilter() { // included sch, err := s.c.GetTable("test", "canal_test") - c.Assert(err, IsNil) - c.Assert(sch, NotNil) + require.NoError(s.T(), err) + require.NotNil(s.T(), sch) _, err = s.c.GetTable("not_exist_db", "canal_test") - c.Assert(errors.Trace(err), Not(Equals), ErrExcludedTable) + require.NotErrorIs(s.T(), err, ErrExcludedTable) // excluded sch, err = s.c.GetTable("test", "canal_test_inner") - c.Assert(errors.Cause(err), Equals, ErrExcludedTable) - c.Assert(sch, IsNil) + require.ErrorIs(s.T(), err, ErrExcludedTable) + require.Nil(s.T(), sch) sch, err = s.c.GetTable("mysql", "canal_test") - c.Assert(errors.Cause(err), Equals, ErrExcludedTable) - c.Assert(sch, IsNil) + require.ErrorIs(s.T(), err, ErrExcludedTable) + require.Nil(s.T(), sch) sch, err = s.c.GetTable("not_exist_db", "not_canal_test") - c.Assert(errors.Cause(err), Equals, ErrExcludedTable) - c.Assert(sch, IsNil) + require.ErrorIs(s.T(), err, ErrExcludedTable) + require.Nil(s.T(), sch) } func TestCreateTableExp(t *testing.T) { @@ -170,22 +164,20 @@ func TestCreateTableExp(t *testing.T) { "CREATE TABLE IF NOT EXISTS mydb.`mytable` (`id` int(10)) ENGINE=InnoDB", "CREATE TABLE IF NOT EXISTS `mydb`.mytable (`id` int(10)) ENGINE=InnoDB", } - table := "mytable" - db := "mydb" + expected := &node{ + db: "mydb", + table: "mytable", + } pr := parser.New() for _, s := range cases { stmts, _, err := pr.Parse(s, "", "") - if err != nil { - t.Fatalf("TestCreateTableExp:case %s failed\n", s) - } + require.NoError(t, err) for _, st := range stmts { nodes := parseStmt(st) if len(nodes) == 0 { continue } - if nodes[0].db != db || nodes[0].table != table { - t.Fatalf("TestCreateTableExp:case %s failed\n", s) - } + require.Equal(t, expected, nodes[0]) } } } @@ -203,9 +195,7 @@ func TestAlterTableExp(t *testing.T) { pr := parser.New() for _, s := range cases { stmts, _, err := pr.Parse(s, "", "") - if err != nil { - t.Fatalf("TestAlterTableExp:case %s failed\n", s) - } + require.NoError(t, err) for _, st := range stmts { nodes := parseStmt(st) if len(nodes) == 0 { @@ -237,9 +227,7 @@ func TestRenameTableExp(t *testing.T) { pr := parser.New() for _, s := range cases { stmts, _, err := pr.Parse(s, "", "") - if err != nil { - t.Fatalf("TestRenameTableExp:case %s failed\n", s) - } + require.NoError(t, err) for _, st := range stmts { nodes := parseStmt(st) if len(nodes) == 0 { @@ -281,9 +269,7 @@ func TestDropTableExp(t *testing.T) { pr := parser.New() for _, s := range cases { stmts, _, err := pr.Parse(s, "", "") - if err != nil { - t.Fatalf("TestDropTableExp:case %s failed\n", s) - } + require.NoError(t, err) for _, st := range stmts { nodes := parseStmt(st) if len(nodes) == 0 { @@ -325,9 +311,7 @@ func TestWithoutSchemeExp(t *testing.T) { pr := parser.New() for _, s := range cases { stmts, _, err := pr.Parse(string(s.Query), "", "") - if err != nil { - t.Fatalf("TestCreateTableExp:case %s failed\n", s.Query) - } + require.NoError(t, err) for _, st := range stmts { nodes := parseStmt(st) if len(nodes) == 0 { diff --git a/client/auth_test.go b/client/auth_test.go index d5c79a1b5..85dba1e98 100644 --- a/client/auth_test.go +++ b/client/auth_test.go @@ -1,10 +1,10 @@ package client import ( - "bytes" "testing" "github.com/go-mysql-org/go-mysql/mysql" + "github.com/stretchr/testify/require" ) func TestConnGenAttributes(t *testing.T) { @@ -26,17 +26,11 @@ func TestConnGenAttributes(t *testing.T) { // the order of the attributes map cannot be guaranteed so to test the content // of the attribute data we need to check its partial contents - if len(data) != 98 { - t.Fatalf("unexpected data length, got %d", len(data)) - } - if data[0] != 0x61 { - t.Fatalf("unexpected length-encoded int, got %#x", data[0]) - } + require.Len(t, data, 98) + require.Equal(t, byte(0x61), data[0]) for k, v := range c.attributes { fixt := append(mysql.PutLengthEncodedString([]byte(k)), mysql.PutLengthEncodedString([]byte(v))...) - if !bytes.Contains(data, fixt) { - t.Fatalf("%s attribute not found", k) - } + require.Subset(t, data, fixt) } } diff --git a/client/client_test.go b/client/client_test.go index a7cc81999..7fddd9dad 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -4,9 +4,11 @@ import ( "encoding/json" "fmt" "strings" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/errors" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "github.com/go-mysql-org/go-mysql/mysql" "github.com/go-mysql-org/go-mysql/test_util" @@ -14,49 +16,55 @@ import ( ) type clientTestSuite struct { + suite.Suite c *Conn port string } -func (s *clientTestSuite) SetUpSuite(c *C) { +func TestClientSuite(t *testing.T) { + segs := strings.Split(*test_util.MysqlPort, ",") + for _, seg := range segs { + suite.Run(t, &clientTestSuite{port: seg}) + } +} + +func (s *clientTestSuite) SetupSuite() { var err error addr := fmt.Sprintf("%s:%s", *test_util.MysqlHost, s.port) s.c, err = Connect(addr, *testUser, *testPassword, "") - if err != nil { - c.Fatal(err) - } + require.NoError(s.T(), err) var result *mysql.Result result, err = s.c.Execute("CREATE DATABASE IF NOT EXISTS " + *testDB) - c.Assert(err, IsNil) - c.Assert(result.RowNumber() >= 0, IsTrue) + require.NoError(s.T(), err) + require.GreaterOrEqual(s.T(), result.RowNumber(), 0) _, err = s.c.Execute("USE " + *testDB) - c.Assert(err, IsNil) + require.NoError(s.T(), err) - s.testConn_CreateTable(c) - s.testStmt_CreateTable(c) + s.testConn_CreateTable() + s.testStmt_CreateTable() } -func (s *clientTestSuite) TearDownSuite(c *C) { +func (s *clientTestSuite) TearDownSuite() { if s.c == nil { return } - s.testConn_DropTable(c) - s.testStmt_DropTable(c) + s.testConn_DropTable() + s.testStmt_DropTable() if s.c != nil { s.c.Close() } } -func (s *clientTestSuite) testConn_DropTable(c *C) { +func (s *clientTestSuite) testConn_DropTable() { _, err := s.c.Execute("drop table if exists mixer_test_conn") - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *clientTestSuite) testConn_CreateTable(c *C) { +func (s *clientTestSuite) testConn_CreateTable() { str := `CREATE TABLE IF NOT EXISTS mixer_test_conn ( id BIGINT(64) UNSIGNED NOT NULL, str VARCHAR(256), @@ -69,15 +77,15 @@ func (s *clientTestSuite) testConn_CreateTable(c *C) { ) ENGINE=InnoDB DEFAULT CHARSET=utf8` _, err := s.c.Execute(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *clientTestSuite) TestConn_Ping(c *C) { +func (s *clientTestSuite) TestConn_Ping() { err := s.c.Ping() - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *clientTestSuite) TestConn_SetCapability(c *C) { +func (s *clientTestSuite) TestConn_SetCapability() { caps := []uint32{ mysql.CLIENT_LONG_PASSWORD, mysql.CLIENT_FOUND_ROWS, @@ -104,44 +112,39 @@ func (s *clientTestSuite) TestConn_SetCapability(c *C) { } for _, capI := range caps { - c.Assert(s.c.ccaps&capI > 0, IsFalse) + require.False(s.T(), s.c.ccaps&capI > 0) s.c.SetCapability(capI) - c.Assert(s.c.ccaps&capI > 0, IsTrue) + require.True(s.T(), s.c.ccaps&capI > 0) s.c.UnsetCapability(capI) - c.Assert(s.c.ccaps&capI > 0, IsFalse) + require.False(s.T(), s.c.ccaps&capI > 0) } } // NOTE for MySQL 5.5 and 5.6, server side has to config SSL to pass the TLS test, otherwise, it will throw error that // MySQL server does not support TLS required by the client. However, for MySQL 5.7 and above, auto generated certificates // are used by default so that manual config is no longer necessary. -func (s *clientTestSuite) TestConn_TLS_Verify(c *C) { +func (s *clientTestSuite) TestConn_TLS_Verify() { // Verify that the provided tls.Config is used when attempting to connect to mysql. // An empty tls.Config will result in a connection error. addr := fmt.Sprintf("%s:%s", *test_util.MysqlHost, s.port) _, err := Connect(addr, *testUser, *testPassword, *testDB, func(c *Conn) { c.UseSSL(false) }) - if err == nil { - c.Fatal("expected error") - } - expected := "either ServerName or InsecureSkipVerify must be specified in the tls.Config" - if !strings.Contains(err.Error(), expected) { - c.Fatalf("expected '%s' to contain '%s'", err.Error(), expected) - } + + require.ErrorContains(s.T(), err, expected) } -func (s *clientTestSuite) TestConn_TLS_Skip_Verify(c *C) { +func (s *clientTestSuite) TestConn_TLS_Skip_Verify() { // An empty tls.Config will result in a connection error but we can configure to skip it. addr := fmt.Sprintf("%s:%s", *test_util.MysqlHost, s.port) _, err := Connect(addr, *testUser, *testPassword, *testDB, func(c *Conn) { c.UseSSL(true) }) - c.Assert(err, Equals, nil) + require.NoError(s.T(), err) } -func (s *clientTestSuite) TestConn_TLS_Certificate(c *C) { +func (s *clientTestSuite) TestConn_TLS_Certificate() { // This test uses the TLS suite in 'go-mysql/docker/resources'. The certificates are not valid for any names. // And if server uses auto-generated certificates, it will be an error like: // "x509: certificate is valid for MySQL_Server_8.0.12_Auto_Generated_Server_Certificate, not not-a-valid-name" @@ -150,96 +153,94 @@ func (s *clientTestSuite) TestConn_TLS_Certificate(c *C) { _, err := Connect(addr, *testUser, *testPassword, *testDB, func(c *Conn) { c.SetTLSConfig(tlsConfig) }) - if err == nil { - c.Fatal("expected error") - } + require.Error(s.T(), err) if !strings.Contains(errors.ErrorStack(err), "certificate is not valid for any names") && !strings.Contains(errors.ErrorStack(err), "certificate is valid for") { - c.Fatalf("expected errors for server name verification, but got unknown error: %s", errors.ErrorStack(err)) + s.T().Fatalf("expected errors for server name verification, but got unknown error: %s", errors.ErrorStack(err)) } } -func (s *clientTestSuite) TestConn_Insert(c *C) { +func (s *clientTestSuite) TestConn_Insert() { str := `insert into mixer_test_conn (id, str, f, e) values(1, "a", 3.14, "test1")` pkg, err := s.c.Execute(str) - c.Assert(err, IsNil) - c.Assert(pkg.AffectedRows, Equals, uint64(1)) + require.NoError(s.T(), err) + require.Equal(s.T(), uint64(1), pkg.AffectedRows) } -func (s *clientTestSuite) TestConn_Insert2(c *C) { +func (s *clientTestSuite) TestConn_Insert2() { str := `insert into mixer_test_conn (id, j) values(?, ?)` j := json.RawMessage(`[]`) pkg, err := s.c.Execute(str, []interface{}{2, j}...) - c.Assert(err, IsNil) - c.Assert(pkg.AffectedRows, Equals, uint64(1)) + require.NoError(s.T(), err) + require.Equal(s.T(), uint64(1), pkg.AffectedRows) } -func (s *clientTestSuite) TestConn_Select(c *C) { +func (s *clientTestSuite) TestConn_Select() { str := `select str, f, e from mixer_test_conn where id = 1` result, err := s.c.Execute(str) - c.Assert(err, IsNil) - c.Assert(result.Fields, HasLen, 3) - c.Assert(result.Values, HasLen, 1) + require.NoError(s.T(), err) + require.Len(s.T(), result.Fields, 3) + require.Len(s.T(), result.Values, 1) ss, _ := result.GetString(0, 0) - c.Assert(ss, Equals, "a") + require.Equal(s.T(), "a", ss) f, _ := result.GetFloat(0, 1) - c.Assert(f, Equals, 3.14) + require.Equal(s.T(), 3.14, f) e, _ := result.GetString(0, 2) - c.Assert(e, Equals, "test1") + require.Equal(s.T(), "test1", e) ss, _ = result.GetStringByName(0, "str") - c.Assert(ss, Equals, "a") + require.Equal(s.T(), "a", ss) f, _ = result.GetFloatByName(0, "f") - c.Assert(f, Equals, 3.14) + require.Equal(s.T(), 3.14, f) e, _ = result.GetStringByName(0, "e") - c.Assert(e, Equals, "test1") + require.Equal(s.T(), "test1", e) } -func (s *clientTestSuite) TestConn_Escape(c *C) { +func (s *clientTestSuite) TestConn_Escape() { e := `""''\abc` str := fmt.Sprintf(`insert into mixer_test_conn (id, str) values(5, "%s")`, mysql.Escape(e)) _, err := s.c.Execute(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) str = `select str from mixer_test_conn where id = ?` r, err := s.c.Execute(str, 5) - c.Assert(err, IsNil) + require.NoError(s.T(), err) ss, _ := r.GetString(0, 0) - c.Assert(ss, Equals, e) + require.Equal(s.T(), e, ss) } -func (s *clientTestSuite) TestConn_SetCharset(c *C) { +func (s *clientTestSuite) TestConn_SetCharset() { err := s.c.SetCharset("gb2312") - c.Assert(err, IsNil) + require.NoError(s.T(), err) err = s.c.SetCharset("utf8") - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *clientTestSuite) testStmt_DropTable(c *C) { +func (s *clientTestSuite) testStmt_DropTable() { str := `drop table if exists mixer_test_stmt` stmt, err := s.c.Prepare(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) defer stmt.Close() _, err = stmt.Execute() - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *clientTestSuite) testStmt_CreateTable(c *C) { +func (s *clientTestSuite) testStmt_CreateTable() { str := `CREATE TABLE IF NOT EXISTS mixer_test_stmt ( id BIGINT(64) UNSIGNED NOT NULL, str VARCHAR(256), @@ -251,175 +252,174 @@ func (s *clientTestSuite) testStmt_CreateTable(c *C) { ) ENGINE=InnoDB DEFAULT CHARSET=utf8` stmt, err := s.c.Prepare(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) defer stmt.Close() _, err = stmt.Execute() - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *clientTestSuite) TestStmt_Delete(c *C) { +func (s *clientTestSuite) TestStmt_Delete() { str := `delete from mixer_test_stmt` stmt, err := s.c.Prepare(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) defer stmt.Close() _, err = stmt.Execute() - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *clientTestSuite) TestStmt_Insert(c *C) { +func (s *clientTestSuite) TestStmt_Insert() { str := `insert into mixer_test_stmt (id, str, f, e, u, i) values (?, ?, ?, ?, ?, ?)` stmt, err := s.c.Prepare(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) defer stmt.Close() r, err := stmt.Execute(1, "a", 3.14, "test1", 255, -127) - c.Assert(err, IsNil) + require.NoError(s.T(), err) - c.Assert(r.AffectedRows, Equals, uint64(1)) + require.Equal(s.T(), uint64(1), r.AffectedRows) } -func (s *clientTestSuite) TestStmt_Select(c *C) { +func (s *clientTestSuite) TestStmt_Select() { str := `select str, f, e from mixer_test_stmt where id = ?` stmt, err := s.c.Prepare(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) defer stmt.Close() result, err := stmt.Execute(1) - c.Assert(err, IsNil) - c.Assert(result.Values, HasLen, 1) - c.Assert(result.Fields, HasLen, 3) + require.NoError(s.T(), err) + require.Len(s.T(), result.Fields, 3) + require.Len(s.T(), result.Values, 1) ss, _ := result.GetString(0, 0) - c.Assert(ss, Equals, "a") + require.Equal(s.T(), "a", ss) f, _ := result.GetFloat(0, 1) - c.Assert(f, Equals, 3.14) + require.Equal(s.T(), 3.14, f) e, _ := result.GetString(0, 2) - c.Assert(e, Equals, "test1") + require.Equal(s.T(), "test1", e) ss, _ = result.GetStringByName(0, "str") - c.Assert(ss, Equals, "a") + require.Equal(s.T(), "a", ss) f, _ = result.GetFloatByName(0, "f") - c.Assert(f, Equals, 3.14) + require.Equal(s.T(), 3.14, f) e, _ = result.GetStringByName(0, "e") - c.Assert(e, Equals, "test1") + require.Equal(s.T(), "test1", e) } -func (s *clientTestSuite) TestStmt_NULL(c *C) { +func (s *clientTestSuite) TestStmt_NULL() { str := `insert into mixer_test_stmt (id, str, f, e) values (?, ?, ?, ?)` stmt, err := s.c.Prepare(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) defer stmt.Close() result, err := stmt.Execute(2, nil, 3.14, nil) - c.Assert(err, IsNil) - - c.Assert(result.AffectedRows, Equals, uint64(1)) + require.NoError(s.T(), err) + require.Equal(s.T(), uint64(1), result.AffectedRows) stmt.Close() str = `select * from mixer_test_stmt where id = ?` stmt, err = s.c.Prepare(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) defer stmt.Close() result, err = stmt.Execute(2) - c.Assert(err, IsNil) + require.NoError(s.T(), err) b, err := result.IsNullByName(0, "id") - c.Assert(err, IsNil) - c.Assert(b, Equals, false) + require.NoError(s.T(), err) + require.False(s.T(), b) b, err = result.IsNullByName(0, "str") - c.Assert(err, IsNil) - c.Assert(b, Equals, true) + require.NoError(s.T(), err) + require.True(s.T(), b) b, err = result.IsNullByName(0, "f") - c.Assert(err, IsNil) - c.Assert(b, Equals, false) + require.NoError(s.T(), err) + require.False(s.T(), b) b, err = result.IsNullByName(0, "e") - c.Assert(err, IsNil) - c.Assert(b, Equals, true) + require.NoError(s.T(), err) + require.True(s.T(), b) } -func (s *clientTestSuite) TestStmt_Unsigned(c *C) { +func (s *clientTestSuite) TestStmt_Unsigned() { str := `insert into mixer_test_stmt (id, u) values (?, ?)` stmt, err := s.c.Prepare(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) defer stmt.Close() result, err := stmt.Execute(3, uint8(255)) - c.Assert(err, IsNil) - c.Assert(result.AffectedRows, Equals, uint64(1)) + require.NoError(s.T(), err) + require.Equal(s.T(), uint64(1), result.AffectedRows) str = `select u from mixer_test_stmt where id = ?` stmt, err = s.c.Prepare(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) defer stmt.Close() result, err = stmt.Execute(3) - c.Assert(err, IsNil) + require.NoError(s.T(), err) u, err := result.GetUint(0, 0) - c.Assert(err, IsNil) - c.Assert(u, Equals, uint64(255)) + require.NoError(s.T(), err) + require.Equal(s.T(), uint64(255), u) } -func (s *clientTestSuite) TestStmt_Signed(c *C) { +func (s *clientTestSuite) TestStmt_Signed() { str := `insert into mixer_test_stmt (id, i) values (?, ?)` stmt, err := s.c.Prepare(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) defer stmt.Close() _, err = stmt.Execute(4, 127) - c.Assert(err, IsNil) + require.NoError(s.T(), err) _, err = stmt.Execute(uint64(18446744073709551516), int8(-128)) - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *clientTestSuite) TestStmt_Trans(c *C) { +func (s *clientTestSuite) TestStmt_Trans() { _, err := s.c.Execute(`insert into mixer_test_stmt (id, str) values (1002, "abc")`) - c.Assert(err, IsNil) + require.NoError(s.T(), err) err = s.c.Begin() - c.Assert(err, IsNil) + require.NoError(s.T(), err) str := `select str from mixer_test_stmt where id = ?` stmt, err := s.c.Prepare(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) defer stmt.Close() _, err = stmt.Execute(1002) - c.Assert(err, IsNil) + require.NoError(s.T(), err) err = s.c.Commit() - c.Assert(err, IsNil) + require.NoError(s.T(), err) r, err := stmt.Execute(1002) - c.Assert(err, IsNil) + require.NoError(s.T(), err) str, _ = r.GetString(0, 0) - c.Assert(str, Equals, `abc`) + require.Equal(s.T(), `abc`, str) } diff --git a/client/common_test.go b/client/common_test.go index d28e63753..b36c1abf5 100644 --- a/client/common_test.go +++ b/client/common_test.go @@ -2,30 +2,8 @@ package client import ( "flag" - "strings" - "testing" - - . "github.com/pingcap/check" - - "github.com/go-mysql-org/go-mysql/test_util" ) var testUser = flag.String("user", "root", "MySQL user") var testPassword = flag.String("pass", "", "MySQL password") var testDB = flag.String("db", "test", "MySQL test database") - -func Test(t *testing.T) { - // We cover the whole range of MySQL server versions using docker-compose to bind them to different ports for testing. - // MySQL is constantly updating auth plugin to make it secure: - // starting from MySQL 8.0.4, a new auth plugin is introduced, causing plain password auth to fail with error: - // ERROR 1251 (08004): Client does not support authentication protocol requested by server; consider upgrading MySQL client - // Hint: use docker-compose to start corresponding MySQL docker containers and add their ports here - - segs := strings.Split(*test_util.MysqlPort, ",") - for _, seg := range segs { - Suite(&clientTestSuite{port: seg}) - Suite(&connTestSuite{port: seg}) - Suite(&poolTestSuite{port: seg}) - } - TestingT(t) -} diff --git a/client/conn_test.go b/client/conn_test.go index 54cae5b33..f3c1e4fae 100644 --- a/client/conn_test.go +++ b/client/conn_test.go @@ -3,19 +3,29 @@ package client import ( "fmt" "strings" + "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "github.com/go-mysql-org/go-mysql/mysql" "github.com/go-mysql-org/go-mysql/test_util" ) type connTestSuite struct { + suite.Suite c *Conn port string } -func (s *connTestSuite) SetUpSuite(c *C) { +func TestConnSuite(t *testing.T) { + segs := strings.Split(*test_util.MysqlPort, ",") + for _, seg := range segs { + suite.Run(t, &connTestSuite{port: seg}) + } +} + +func (s *connTestSuite) SetupSuite() { var err error addr := fmt.Sprintf("%s:%s", *test_util.MysqlHost, s.port) s.c, err = Connect(addr, *testUser, *testPassword, "", func(c *Conn) { @@ -23,25 +33,23 @@ func (s *connTestSuite) SetUpSuite(c *C) { c.SetCapability(mysql.CLIENT_MULTI_STATEMENTS) c.SetAttributes(map[string]string{"attrtest": "attrvalue"}) }) - if err != nil { - c.Fatal(err) - } + require.NoError(s.T(), err) _, err = s.c.Execute("CREATE DATABASE IF NOT EXISTS " + *testDB) - c.Assert(err, IsNil) + require.NoError(s.T(), err) _, err = s.c.Execute("USE " + *testDB) - c.Assert(err, IsNil) + require.NoError(s.T(), err) - s.testExecute_CreateTable(c) + s.testExecute_CreateTable() } -func (s *connTestSuite) TearDownSuite(c *C) { +func (s *connTestSuite) TearDownSuite() { if s.c == nil { return } - s.testExecute_DropTable(c) + s.testExecute_DropTable() if s.c != nil { s.c.Close() @@ -53,7 +61,7 @@ var ( testExecuteSelectStreamingTablename = "execute_plain_table" ) -func (s *connTestSuite) testExecute_CreateTable(c *C) { +func (s *connTestSuite) testExecute_CreateTable() { str := `CREATE TABLE IF NOT EXISTS ` + testExecuteSelectStreamingTablename + ` ( id INT UNSIGNED NOT NULL, str VARCHAR(256), @@ -61,36 +69,36 @@ func (s *connTestSuite) testExecute_CreateTable(c *C) { ) ENGINE=InnoDB DEFAULT CHARSET=utf8` result, err := s.c.Execute(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) result.Close() result, err = s.c.Execute(`TRUNCATE TABLE ` + testExecuteSelectStreamingTablename) - c.Assert(err, IsNil) + require.NoError(s.T(), err) result.Close() stmt, err := s.c.Prepare(`INSERT INTO ` + testExecuteSelectStreamingTablename + ` (id, str) VALUES (?, ?)`) - c.Assert(err, IsNil) + require.NoError(s.T(), err) defer stmt.Close() for id, str := range testExecuteSelectStreamingRows { result, err := stmt.Execute(id, str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) result.Close() } } -func (s *connTestSuite) testExecute_DropTable(c *C) { +func (s *connTestSuite) testExecute_DropTable() { _, err := s.c.Execute(`drop table if exists ` + testExecuteSelectStreamingTablename) - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *connTestSuite) TestFieldList(c *C) { +func (s *connTestSuite) TestFieldList() { fields, err := s.c.FieldList(testExecuteSelectStreamingTablename, "") - c.Assert(err, IsNil) - c.Assert(fields, HasLen, 2) + require.NoError(s.T(), err) + require.Len(s.T(), fields, 2) } -func (s *connTestSuite) TestExecuteMultiple(c *C) { +func (s *connTestSuite) TestExecuteMultiple() { queries := []string{ `INSERT INTO ` + testExecuteSelectStreamingTablename + ` (id, str) VALUES (999, "executemultiple")`, `SELECT id FROM ` + testExecuteSelectStreamingTablename + ` LIMIT 2`, @@ -106,31 +114,31 @@ func (s *connTestSuite) TestExecuteMultiple(c *C) { // also, since this is not the last query, the SERVER_MORE_RESULTS_EXISTS // flag should be set case 0, 2: - c.Assert(result.Status&mysql.SERVER_MORE_RESULTS_EXISTS, Not(Equals), 0) - c.Assert(result.Resultset, IsNil) - c.Assert(result.AffectedRows, Equals, uint64(1)) - c.Assert(err, IsNil) + require.True(s.T(), result.Status&mysql.SERVER_MORE_RESULTS_EXISTS > 0) + require.Nil(s.T(), result.Resultset) + require.Equal(s.T(), uint64(1), result.AffectedRows) + require.NoError(s.T(), err) case 1: // the SELECT query should have an resultset // still not the last query, flag should be set - c.Assert(result.Status&mysql.SERVER_MORE_RESULTS_EXISTS, Not(Equals), 0) - c.Assert(result.Resultset, NotNil) - c.Assert(err, IsNil) + require.True(s.T(), result.Status&mysql.SERVER_MORE_RESULTS_EXISTS > 0) + require.NotNil(s.T(), result.Resultset) + require.NoError(s.T(), err) case 3: // this query is obviously bogus so the error should be non-nil - c.Assert(result, IsNil) - c.Assert(err, NotNil) + require.Nil(s.T(), result) + require.Error(s.T(), err) } count++ }) - c.Assert(count, Equals, 4) - c.Assert(err, IsNil) - c.Assert(result.StreamingDone, Equals, true) - c.Assert(result.Streaming, Equals, mysql.StreamingMultiple) + require.Equal(s.T(), 4, count) + require.NoError(s.T(), err) + require.True(s.T(), result.StreamingDone) + require.Equal(s.T(), mysql.StreamingMultiple, result.Streaming) } -func (s *connTestSuite) TestExecuteSelectStreaming(c *C) { +func (s *connTestSuite) TestExecuteSelectStreaming() { var ( expectedRowId int64 perResultCallbackCalledTimes int @@ -143,42 +151,42 @@ func (s *connTestSuite) TestExecuteSelectStreaming(c *C) { &result, func(row []mysql.FieldValue) error { // Check number of columns - c.Assert(row, HasLen, colsInResult) + require.Len(s.T(), row, colsInResult) // Check type of columns - c.Assert(row[0].Type, Equals, mysql.FieldValueType(mysql.FieldValueTypeUnsigned)) - c.Assert(row[1].Type, Equals, mysql.FieldValueType(mysql.FieldValueTypeString)) + require.Equal(s.T(), mysql.FieldValueType(mysql.FieldValueTypeUnsigned), row[0].Type) + require.Equal(s.T(), mysql.FieldValueType(mysql.FieldValueTypeString), row[1].Type) id := row[0].AsInt64() str := row[1].AsString() // Check order of rows - c.Assert(id, Equals, expectedRowId) + require.Equal(s.T(), expectedRowId, id) // Check string values (protection from incorrect reuse of memory) - c.Assert(string(str), Equals, testExecuteSelectStreamingRows[id]) + require.Equal(s.T(), testExecuteSelectStreamingRows[id], string(str)) expectedRowId++ return nil }, func(result *mysql.Result) error { // result.Resultset must be defined at this point - c.Assert(result.Resultset, NotNil) + require.NotNil(s.T(), result.Resultset) // Check number of columns - c.Assert(result.Resultset.Fields, HasLen, colsInResult) + require.Len(s.T(), result.Resultset.Fields, colsInResult) perResultCallbackCalledTimes++ return nil }) - c.Assert(err, IsNil) + require.NoError(s.T(), err) // Check total rows count - c.Assert(expectedRowId, Equals, int64(len(testExecuteSelectStreamingRows))) + require.Equal(s.T(), int64(len(testExecuteSelectStreamingRows)), expectedRowId) // Check perResultCallback call count - c.Assert(perResultCallbackCalledTimes, Equals, 1) + require.Equal(s.T(), 1, perResultCallbackCalledTimes) } -func (s *connTestSuite) TestAttributes(c *C) { +func (s *connTestSuite) TestAttributes() { // Test that both custom attributes and library set attributes are visible - c.Assert(s.c.attributes["_client_name"], Equals, "go-mysql") - c.Assert(s.c.attributes["attrtest"], Equals, "attrvalue") + require.Equal(s.T(), "go-mysql", s.c.attributes["_client_name"]) + require.Equal(s.T(), "attrvalue", s.c.attributes["attrtest"]) } diff --git a/client/pool_test.go b/client/pool_test.go index 8d6e0c05a..1599f9662 100644 --- a/client/pool_test.go +++ b/client/pool_test.go @@ -3,29 +3,40 @@ package client import ( "context" "fmt" + "strings" + "testing" "github.com/go-mysql-org/go-mysql/test_util" - . "github.com/pingcap/check" "github.com/siddontang/go-log/log" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" ) type poolTestSuite struct { + suite.Suite port string } -func (s poolTestSuite) TestPool_Close(c *C) { +func TestPoolSuite(t *testing.T) { + segs := strings.Split(*test_util.MysqlPort, ",") + for _, seg := range segs { + suite.Run(t, &poolTestSuite{port: seg}) + } +} + +func (s *poolTestSuite) TestPool_Close() { addr := fmt.Sprintf("%s:%s", *test_util.MysqlHost, s.port) pool := NewPool(log.Debugf, 5, 10, 5, addr, *testUser, *testPassword, "") conn, err := pool.GetConn(context.Background()) - c.Assert(err, IsNil) + require.NoError(s.T(), err) err = conn.Ping() - c.Assert(err, IsNil) + require.NoError(s.T(), err) pool.PutConn(conn) pool.Close() var poolStats ConnectionStats pool.GetStats(&poolStats) - c.Assert(poolStats.TotalCount, Equals, 0) - c.Assert(pool.readyConnection, HasLen, 0) + require.Equal(s.T(), 0, poolStats.TotalCount) + require.Len(s.T(), pool.readyConnection, 0) _, err = pool.GetConn(context.Background()) - c.Assert(err, NotNil) + require.Error(s.T(), err) } diff --git a/driver/driver_test.go b/driver/driver_test.go index b60a2e5d7..3f7575613 100644 --- a/driver/driver_test.go +++ b/driver/driver_test.go @@ -4,11 +4,11 @@ import ( "flag" "fmt" "net/url" - "reflect" "testing" "github.com/jmoiron/sqlx" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "github.com/go-mysql-org/go-mysql/test_util" ) @@ -18,64 +18,63 @@ var testPassword = flag.String("pass", "", "MySQL password") var testDB = flag.String("db", "test", "MySQL test database") func TestDriver(t *testing.T) { - TestingT(t) + suite.Run(t, new(testDriverSuite)) } type testDriverSuite struct { + suite.Suite db *sqlx.DB } -var _ = Suite(&testDriverSuite{}) - -func (s *testDriverSuite) SetUpSuite(c *C) { +func (s *testDriverSuite) SetupSuite() { addr := fmt.Sprintf("%s:%s", *test_util.MysqlHost, *test_util.MysqlPort) dsn := fmt.Sprintf("%s:%s@%s/%s", *testUser, *testPassword, addr, *testDB) var err error s.db, err = sqlx.Open("mysql", dsn) - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *testDriverSuite) TearDownSuite(c *C) { +func (s *testDriverSuite) TearDownSuite() { if s.db != nil { s.db.Close() } } -func (s *testDriverSuite) TestConn(c *C) { +func (s *testDriverSuite) TestConn() { var n int err := s.db.Get(&n, "SELECT 1") - c.Assert(err, IsNil) - c.Assert(n, Equals, 1) + require.NoError(s.T(), err) + require.Equal(s.T(), 1, n) _, err = s.db.Exec("USE test") - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *testDriverSuite) TestStmt(c *C) { +func (s *testDriverSuite) TestStmt() { stmt, err := s.db.Preparex("SELECT ? + ?") - c.Assert(err, IsNil) + require.NoError(s.T(), err) var n int err = stmt.Get(&n, 1, 1) - c.Assert(err, IsNil) - c.Assert(n, Equals, 2) + require.NoError(s.T(), err) + require.Equal(s.T(), 2, n) err = stmt.Close() - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *testDriverSuite) TestTransaction(c *C) { +func (s *testDriverSuite) TestTransaction() { tx, err := s.db.Beginx() - c.Assert(err, IsNil) + require.NoError(s.T(), err) var n int err = tx.Get(&n, "SELECT 1") - c.Assert(err, IsNil) - c.Assert(n, Equals, 1) + require.NoError(s.T(), err) + require.Equal(s.T(), 1, n) err = tx.Commit() - c.Assert(err, IsNil) + require.NoError(s.T(), err) } func TestParseDSN(t *testing.T) { @@ -93,12 +92,8 @@ func TestParseDSN(t *testing.T) { for supplied, expected := range testDSNs { actual, err := parseDSN(supplied) - if err != nil { - t.Errorf("TestParseDSN failed. Got error: %s", err) - } + require.NoError(t, err) // Compare that with expected - if !reflect.DeepEqual(actual, expected) { - t.Errorf("TestParseDSN failed.\nExpected:\n%#v\nGot:\n%#v", expected, actual) - } + require.Equal(t, expected, actual) } } diff --git a/dump/parser_test.go b/dump/parser_test.go index 73d301559..3e5fc9ba0 100644 --- a/dump/parser_test.go +++ b/dump/parser_test.go @@ -2,17 +2,13 @@ package dump import ( "strings" + "testing" "github.com/go-mysql-org/go-mysql/mysql" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -type parserTestSuite struct { -} - -var _ = Suite(&parserTestSuite{}) - -func (s *parserTestSuite) TestParseGtidExp(c *C) { +func TestParseGtidExp(t *testing.T) { // binlogExp := regexp.MustCompile("^CHANGE MASTER TO MASTER_LOG_FILE='(.+)', MASTER_LOG_POS=(\\d+);") // gtidExp := regexp.MustCompile("(\\w{8}(-\\w{4}){3}-\\w{12}:\\d+-\\d+)") tbls := []struct { @@ -56,22 +52,22 @@ e7574090-b123-11e8-8bb4-005056a29643:1' var handler = new(testParseHandler) err := Parse(reader, handler, true) - c.Assert(err, IsNil) + require.NoError(t, err) if tt.expected == "" { if handler.gset != nil { - c.Assert(handler.gset, IsNil) + require.Nil(t, handler.gset) } else { continue } } expectedGtidset, err := mysql.ParseGTIDSet("mysql", tt.expected) - c.Assert(err, IsNil) - c.Assert(expectedGtidset.Equal(handler.gset), IsTrue) + require.NoError(t, err) + require.True(t, expectedGtidset.Equal(handler.gset)) } } -func (s *parserTestSuite) TestParseFindTable(c *C) { +func TestParseFindTable(t *testing.T) { tbl := []struct { sql string table string @@ -81,13 +77,13 @@ func (s *parserTestSuite) TestParseFindTable(c *C) { {"INSERT INTO `a.b` VALUES ('1');", "a.b"}, } - for _, t := range tbl { - res := valuesExp.FindAllStringSubmatch(t.sql, -1)[0][1] - c.Assert(res, Equals, t.table) + for _, te := range tbl { + res := valuesExp.FindAllStringSubmatch(te.sql, -1)[0][1] + require.Equal(t, te.table, res) } } -func (s *parserTestSuite) TestUnescape(c *C) { +func TestUnescape(t *testing.T) { tbl := []struct { escaped string expected string @@ -106,29 +102,29 @@ func (s *parserTestSuite) TestUnescape(c *C) { {`\abc`, `abc`}, } - for _, t := range tbl { - unesacped := unescapeString(t.escaped) - c.Assert(unesacped, Equals, t.expected) + for _, te := range tbl { + unesacped := unescapeString(te.escaped) + require.Equal(t, te.expected, unesacped) } } -func (s *parserTestSuite) TestParseValue(c *C) { +func TestParseValue(t *testing.T) { str := `'abc\\',''` values, err := parseValues(str) - c.Assert(err, IsNil) - c.Assert(values, DeepEquals, []string{`'abc\'`, `''`}) + require.NoError(t, err) + require.Equal(t, []string{`'abc\'`, `''`}, values) str = `123,'\Z#÷QÎx£. Æ‘ÇoPâÅ_\r—\\','','qn'` values, err = parseValues(str) - c.Assert(err, IsNil) - c.Assert(values, HasLen, 4) + require.NoError(t, err) + require.Len(t, values, 4) str = `123,'\Z#÷QÎx£. Æ‘ÇoPâÅ_\r—\\','','qn\'` _, err = parseValues(str) - c.Assert(err, NotNil) + require.Error(t, err) } -func (s *parserTestSuite) TestParseLine(c *C) { +func TestParseLine(t *testing.T) { lines := []struct { line string expected string @@ -143,13 +139,13 @@ func (s *parserTestSuite) TestParseLine(c *C) { return c == '\r' || c == '\n' } - for _, t := range lines { - l := strings.TrimRightFunc(t.line, f) + for _, te := range lines { + l := strings.TrimRightFunc(te.line, f) m := valuesExp.FindAllStringSubmatch(l, -1) - c.Assert(m, HasLen, 1) - c.Assert(m[0][1], Matches, "test") - c.Assert(m[0][2], Matches, t.expected) + require.Len(t, m, 1) + require.Equal(t, "test", m[0][1]) + require.Equal(t, te.expected, m[0][2]) } } diff --git a/dump/schema_test.go b/dump/schema_test.go index d3ca014e0..6f506c1ee 100644 --- a/dump/schema_test.go +++ b/dump/schema_test.go @@ -5,39 +5,44 @@ import ( "fmt" "io" "os" + "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "github.com/go-mysql-org/go-mysql/client" "github.com/go-mysql-org/go-mysql/test_util" ) type schemaTestSuite struct { + suite.Suite conn *client.Conn d *Dumper } -var _ = Suite(&schemaTestSuite{}) +func TestSchemaSuite(t *testing.T) { + suite.Run(t, new(schemaTestSuite)) +} -func (s *schemaTestSuite) SetUpSuite(c *C) { +func (s *schemaTestSuite) SetupSuite() { addr := fmt.Sprintf("%s:%s", *test_util.MysqlHost, *test_util.MysqlPort) var err error s.conn, err = client.Connect(addr, "root", "", "") - c.Assert(err, IsNil) + require.NoError(s.T(), err) s.d, err = NewDumper(*execution, addr, "root", "") - c.Assert(err, IsNil) - c.Assert(s.d, NotNil) + require.NoError(s.T(), err) + require.NotNil(s.T(), s.d) s.d.SetCharset("utf8") s.d.SetErrOut(os.Stderr) _, err = s.conn.Execute("CREATE DATABASE IF NOT EXISTS test1") - c.Assert(err, IsNil) + require.NoError(s.T(), err) _, err = s.conn.Execute("CREATE DATABASE IF NOT EXISTS test2") - c.Assert(err, IsNil) + require.NoError(s.T(), err) str := `CREATE TABLE IF NOT EXISTS test%d.t%d ( id int AUTO_INCREMENT, @@ -45,45 +50,45 @@ func (s *schemaTestSuite) SetUpSuite(c *C) { PRIMARY KEY(id) ) ENGINE=INNODB` _, err = s.conn.Execute(fmt.Sprintf(str, 1, 1)) - c.Assert(err, IsNil) + require.NoError(s.T(), err) _, err = s.conn.Execute(fmt.Sprintf(str, 2, 1)) - c.Assert(err, IsNil) + require.NoError(s.T(), err) _, err = s.conn.Execute(fmt.Sprintf(str, 1, 2)) - c.Assert(err, IsNil) + require.NoError(s.T(), err) _, err = s.conn.Execute(fmt.Sprintf(str, 2, 2)) - c.Assert(err, IsNil) + require.NoError(s.T(), err) str = `INSERT INTO test%d.t%d (name) VALUES ("a"), ("b"), ("\\"), ("''")` _, err = s.conn.Execute(fmt.Sprintf(str, 1, 1)) - c.Assert(err, IsNil) + require.NoError(s.T(), err) _, err = s.conn.Execute(fmt.Sprintf(str, 2, 1)) - c.Assert(err, IsNil) + require.NoError(s.T(), err) _, err = s.conn.Execute(fmt.Sprintf(str, 1, 2)) - c.Assert(err, IsNil) + require.NoError(s.T(), err) _, err = s.conn.Execute(fmt.Sprintf(str, 2, 2)) - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *schemaTestSuite) TearDownSuite(c *C) { +func (s *schemaTestSuite) TearDownSuite() { if s.conn != nil { _, err := s.conn.Execute("DROP DATABASE IF EXISTS test1") - c.Assert(err, IsNil) + require.NoError(s.T(), err) _, err = s.conn.Execute("DROP DATABASE IF EXISTS test2") - c.Assert(err, IsNil) + require.NoError(s.T(), err) s.conn.Close() } } -func (s *schemaTestSuite) TestDump(c *C) { +func (s *schemaTestSuite) TestDump() { // Using mysql 5.7 can't work, error: // mysqldump: Error 1412: Table definition has changed, // please retry transaction when dumping table `test_replication` at row: 0 @@ -95,15 +100,15 @@ func (s *schemaTestSuite) TestDump(c *C) { s.d.AddIgnoreTables("test1", "t2") err := s.d.Dump(io.Discard) - c.Assert(err, IsNil) + require.NoError(s.T(), err) s.d.AddTables("test1", "t1") err = s.d.Dump(io.Discard) - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *schemaTestSuite) TestParse(c *C) { +func (s *schemaTestSuite) TestParse() { var buf bytes.Buffer s.d.Reset() @@ -111,8 +116,8 @@ func (s *schemaTestSuite) TestParse(c *C) { s.d.AddDatabases("test1", "test2") err := s.d.Dump(&buf) - c.Assert(err, IsNil) + require.NoError(s.T(), err) err = Parse(&buf, new(testParseHandler), true) - c.Assert(err, IsNil) + require.NoError(s.T(), err) } diff --git a/dump/setup_test.go b/dump/setup_test.go index 4eff73b1d..029df78d9 100644 --- a/dump/setup_test.go +++ b/dump/setup_test.go @@ -2,18 +2,12 @@ package dump import ( "flag" - "testing" "github.com/go-mysql-org/go-mysql/mysql" - . "github.com/pingcap/check" ) var execution = flag.String("exec", "mysqldump", "mysqldump execution path") -func Test(t *testing.T) { - TestingT(t) -} - type testParseHandler struct { gset mysql.GTIDSet } diff --git a/failover/failover_test.go b/failover/failover_test.go index 2c6246efa..fe72305ff 100644 --- a/failover/failover_test.go +++ b/failover/failover_test.go @@ -5,26 +5,26 @@ import ( "fmt" "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "github.com/go-mysql-org/go-mysql/test_util" ) var enable_failover_test = flag.Bool("test-failover", false, "enable test failover") -func Test(t *testing.T) { - TestingT(t) -} - type failoverTestSuite struct { + suite.Suite s []*Server } -var _ = Suite(&failoverTestSuite{}) +func TestFailoverSuite(t *testing.T) { + suite.Run(t, new(failoverTestSuite)) +} -func (s *failoverTestSuite) SetUpSuite(c *C) { +func (s *failoverTestSuite) SetupSuite() { if !*enable_failover_test { - c.Skip("skip test failover") + s.T().Skip("skip test failover") } ports := []int{3306, 3307, 3308, 3316, 3317, 3318} @@ -38,139 +38,139 @@ func (s *failoverTestSuite) SetUpSuite(c *C) { var err error for i := 0; i < len(ports); i++ { err = s.s[i].StopSlave() - c.Assert(err, IsNil) + require.NoError(s.T(), err) err = s.s[i].ResetSlaveALL() - c.Assert(err, IsNil) + require.NoError(s.T(), err) _, err = s.s[i].Execute(`SET GLOBAL BINLOG_FORMAT = "ROW"`) - c.Assert(err, IsNil) + require.NoError(s.T(), err) _, err = s.s[i].Execute("DROP TABLE IF EXISTS test.go_mysql_test") - c.Assert(err, IsNil) + require.NoError(s.T(), err) _, err = s.s[i].Execute("CREATE TABLE IF NOT EXISTS test.go_mysql_test (id INT AUTO_INCREMENT, name VARCHAR(256), PRIMARY KEY(id)) engine=innodb") - c.Assert(err, IsNil) + require.NoError(s.T(), err) err = s.s[i].ResetMaster() - c.Assert(err, IsNil) + require.NoError(s.T(), err) } } -func (s *failoverTestSuite) TearDownSuite(c *C) { +func (s *failoverTestSuite) TearDownSuite() { } -func (s *failoverTestSuite) TestMysqlFailover(c *C) { +func (s *failoverTestSuite) TestMysqlFailover() { h := new(MysqlGTIDHandler) m := s.s[0] s1 := s.s[1] s2 := s.s[2] - s.testFailover(c, h, m, s1, s2) + s.testFailover(h, m, s1, s2) } -func (s *failoverTestSuite) TestMariadbFailover(c *C) { +func (s *failoverTestSuite) TestMariadbFailover() { h := new(MariadbGTIDHandler) for i := 3; i <= 5; i++ { _, err := s.s[i].Execute("SET GLOBAL gtid_slave_pos = ''") - c.Assert(err, IsNil) + require.NoError(s.T(), err) } m := s.s[3] s1 := s.s[4] s2 := s.s[5] - s.testFailover(c, h, m, s1, s2) + s.testFailover(h, m, s1, s2) } -func (s *failoverTestSuite) testFailover(c *C, h Handler, m *Server, s1 *Server, s2 *Server) { +func (s *failoverTestSuite) testFailover(h Handler, m *Server, s1 *Server, s2 *Server) { var err error err = h.ChangeMasterTo(s1, m) - c.Assert(err, IsNil) + require.NoError(s.T(), err) err = h.ChangeMasterTo(s2, m) - c.Assert(err, IsNil) + require.NoError(s.T(), err) - id := s.checkInsert(c, m, "a") + id := s.checkInsert(m, "a") err = h.WaitCatchMaster(s1, m) - c.Assert(err, IsNil) + require.NoError(s.T(), err) err = h.WaitCatchMaster(s2, m) - c.Assert(err, IsNil) + require.NoError(s.T(), err) - s.checkSelect(c, s1, id, "a") - s.checkSelect(c, s2, id, "a") + s.checkSelect(s1, id, "a") + s.checkSelect(s2, id, "a") err = s2.StopSlaveIOThread() - c.Assert(err, IsNil) + require.NoError(s.T(), err) - _ = s.checkInsert(c, m, "b") - id = s.checkInsert(c, m, "c") + _ = s.checkInsert(m, "b") + id = s.checkInsert(m, "c") err = h.WaitCatchMaster(s1, m) - c.Assert(err, IsNil) + require.NoError(s.T(), err) - s.checkSelect(c, s1, id, "c") + s.checkSelect(s1, id, "c") best, err := h.FindBestSlaves([]*Server{s1, s2}) - c.Assert(err, IsNil) - c.Assert(best, DeepEquals, []*Server{s1}) + require.NoError(s.T(), err) + require.Equal(s.T(), []*Server{s1}, best) // promote s1 to master err = h.Promote(s1) - c.Assert(err, IsNil) + require.NoError(s.T(), err) // change s2 to master s1 err = h.ChangeMasterTo(s2, s1) - c.Assert(err, IsNil) + require.NoError(s.T(), err) err = h.WaitCatchMaster(s2, s1) - c.Assert(err, IsNil) + require.NoError(s.T(), err) - s.checkSelect(c, s2, id, "c") + s.checkSelect(s2, id, "c") // change m to master s1 err = h.ChangeMasterTo(m, s1) - c.Assert(err, IsNil) + require.NoError(s.T(), err) m, s1 = s1, m - _ = s.checkInsert(c, m, "d") + _ = s.checkInsert(m, "d") err = h.WaitCatchMaster(s1, m) - c.Assert(err, IsNil) + require.NoError(s.T(), err) err = h.WaitCatchMaster(s2, m) - c.Assert(err, IsNil) + require.NoError(s.T(), err) best, err = h.FindBestSlaves([]*Server{s1, s2}) - c.Assert(err, IsNil) - c.Assert(best, DeepEquals, []*Server{s1, s2}) + require.NoError(s.T(), err) + require.Equal(s.T(), []*Server{s1, s2}, best) err = s2.StopSlaveIOThread() - c.Assert(err, IsNil) + require.NoError(s.T(), err) - _ = s.checkInsert(c, m, "e") + _ = s.checkInsert(m, "e") err = h.WaitCatchMaster(s1, m) - c.Assert(err, IsNil) + require.NoError(s.T(), err) best, err = h.FindBestSlaves([]*Server{s1, s2}) - c.Assert(err, IsNil) - c.Assert(best, DeepEquals, []*Server{s1}) + require.NoError(s.T(), err) + require.Equal(s.T(), []*Server{s1}, best) } -func (s *failoverTestSuite) checkSelect(c *C, m *Server, id uint64, name string) { +func (s *failoverTestSuite) checkSelect(m *Server, id uint64, name string) { rr, err := m.Execute("SELECT name FROM test.go_mysql_test WHERE id = ?", id) - c.Assert(err, IsNil) + require.NoError(s.T(), err) str, _ := rr.GetString(0, 0) - c.Assert(str, Equals, name) + require.Equal(s.T(), name, str) } -func (s *failoverTestSuite) checkInsert(c *C, m *Server, name string) uint64 { +func (s *failoverTestSuite) checkInsert(m *Server, name string) uint64 { r, err := m.Execute("INSERT INTO test.go_mysql_test (name) VALUES (?)", name) - c.Assert(err, IsNil) + require.NoError(s.T(), err) return r.InsertId } diff --git a/go.mod b/go.mod index 5021642f4..e8aee825b 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,6 @@ require ( github.com/google/uuid v1.3.0 github.com/jmoiron/sqlx v1.3.3 github.com/klauspost/compress v1.16.6 - github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63 github.com/pingcap/tidb/parser v0.0.0-20221126021158-6b02a5d8ba7d github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 diff --git a/go.sum b/go.sum index d5f27b2d5..7590a4989 100644 --- a/go.sum +++ b/go.sum @@ -28,8 +28,6 @@ github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 h1:USx2/E1bX46VG32FIw034Au6seQ2fY9NEILmNh/UlQg= -github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63 h1:+FZIDR/D97YOPik4N4lPDaUcLDF/EQPogxtlHB2ZZRM= github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg= diff --git a/mysql/mariadb_gtid_test.go b/mysql/mariadb_gtid_test.go index 6d0ce22c3..989c95949 100644 --- a/mysql/mariadb_gtid_test.go +++ b/mysql/mariadb_gtid_test.go @@ -1,23 +1,12 @@ package mysql import ( - "github.com/pingcap/check" -) - -type mariaDBTestSuite struct { -} - -var _ = check.Suite(&mariaDBTestSuite{}) - -func (t *mariaDBTestSuite) SetUpSuite(c *check.C) { + "testing" -} - -func (t *mariaDBTestSuite) TearDownSuite(c *check.C) { - -} + "github.com/stretchr/testify/require" +) -func (t *mariaDBTestSuite) TestParseMariaDBGTID(c *check.C) { +func TestParseMariaDBGTID(t *testing.T) { cases := []struct { gtidStr string hashError bool @@ -32,15 +21,15 @@ func (t *mariaDBTestSuite) TestParseMariaDBGTID(c *check.C) { for _, cs := range cases { gtid, err := ParseMariadbGTID(cs.gtidStr) if cs.hashError { - c.Assert(err, check.NotNil) + require.Error(t, err) } else { - c.Assert(err, check.IsNil) - c.Assert(gtid.String(), check.Equals, cs.gtidStr) + require.NoError(t, err) + require.Equal(t, cs.gtidStr, gtid.String()) } } } -func (t *mariaDBTestSuite) TestMariaDBGTIDConatin(c *check.C) { +func TestMariaDBGTIDConatin(t *testing.T) { cases := []struct { originGTIDStr, otherGTIDStr string contain bool @@ -54,23 +43,23 @@ func (t *mariaDBTestSuite) TestMariaDBGTIDConatin(c *check.C) { for _, cs := range cases { originGTID, err := ParseMariadbGTID(cs.originGTIDStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) otherGTID, err := ParseMariadbGTID(cs.otherGTIDStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) - c.Assert(originGTID.Contain(otherGTID), check.Equals, cs.contain) + require.Equal(t, cs.contain, originGTID.Contain(otherGTID)) } } -func (t *mariaDBTestSuite) TestMariaDBGTIDClone(c *check.C) { +func TestMariaDBGTIDClone(t *testing.T) { gtid, err := ParseMariadbGTID("1-1-1") - c.Assert(err, check.IsNil) + require.NoError(t, err) clone := gtid.Clone() - c.Assert(gtid, check.DeepEquals, clone) + require.Equal(t, gtid, clone) } -func (t *mariaDBTestSuite) TestMariaDBForward(c *check.C) { +func TestMariaDBForward(t *testing.T) { cases := []struct { currentGTIDStr, newerGTIDStr string hashError bool @@ -84,22 +73,22 @@ func (t *mariaDBTestSuite) TestMariaDBForward(c *check.C) { for _, cs := range cases { currentGTID, err := ParseMariadbGTID(cs.currentGTIDStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) newerGTID, err := ParseMariadbGTID(cs.newerGTIDStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) err = currentGTID.forward(newerGTID) if cs.hashError { - c.Assert(err, check.NotNil) - c.Assert(currentGTID.String(), check.Equals, cs.currentGTIDStr) + require.Error(t, err) + require.Equal(t, cs.currentGTIDStr, currentGTID.String()) } else { - c.Assert(err, check.IsNil) - c.Assert(currentGTID.String(), check.Equals, cs.newerGTIDStr) + require.NoError(t, err) + require.Equal(t, cs.newerGTIDStr, currentGTID.String()) } } } -func (t *mariaDBTestSuite) TestParseMariaDBGTIDSet(c *check.C) { +func TestParseMariaDBGTIDSet(t *testing.T) { cases := []struct { gtidStr string subGTIDs map[uint32]string //domain ID => gtid string @@ -115,17 +104,17 @@ func (t *mariaDBTestSuite) TestParseMariaDBGTIDSet(c *check.C) { for _, cs := range cases { gtidSet, err := ParseMariadbGTIDSet(cs.gtidStr) if cs.hasError { - c.Assert(err, check.NotNil) + require.Error(t, err) } else { - c.Assert(err, check.IsNil) + require.NoError(t, err) mariadbGTIDSet, ok := gtidSet.(*MariadbGTIDSet) - c.Assert(ok, check.IsTrue) + require.True(t, ok) // check sub gtid - c.Assert(mariadbGTIDSet.Sets, check.HasLen, len(cs.subGTIDs)) + require.Len(t, mariadbGTIDSet.Sets, len(cs.subGTIDs)) for domainID, gtid := range mariadbGTIDSet.Sets { - c.Assert(mariadbGTIDSet.Sets, check.HasKey, domainID) - c.Assert(gtid.String(), check.Equals, cs.subGTIDs[domainID]) + require.Contains(t, mariadbGTIDSet.Sets, domainID) + require.Equal(t, cs.subGTIDs[domainID], gtid.String()) } // check String() function @@ -137,12 +126,12 @@ func (t *mariaDBTestSuite) TestParseMariaDBGTIDSet(c *check.C) { break } } - c.Assert(inExpectedResult, check.IsTrue) + require.True(t, inExpectedResult) } } } -func (t *mariaDBTestSuite) TestMariaDBGTIDSetUpdate(c *check.C) { +func TestMariaDBGTIDSetUpdate(t *testing.T) { cases := []struct { isNilGTID bool gtidStr string @@ -157,26 +146,26 @@ func (t *mariaDBTestSuite) TestMariaDBGTIDSetUpdate(c *check.C) { for _, cs := range cases { gtidSet, err := ParseMariadbGTIDSet("1-1-1,2-2-2") - c.Assert(err, check.IsNil) + require.NoError(t, err) mariadbGTIDSet, ok := gtidSet.(*MariadbGTIDSet) - c.Assert(ok, check.IsTrue) + require.True(t, ok) if cs.isNilGTID { - c.Assert(mariadbGTIDSet.AddSet(nil), check.IsNil) + require.NoError(t, mariadbGTIDSet.AddSet(nil)) } else { err := gtidSet.Update(cs.gtidStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) } // check sub gtid - c.Assert(mariadbGTIDSet.Sets, check.HasLen, len(cs.subGTIDs)) + require.Len(t, mariadbGTIDSet.Sets, len(cs.subGTIDs)) for domainID, gtid := range mariadbGTIDSet.Sets { - c.Assert(mariadbGTIDSet.Sets, check.HasKey, domainID) - c.Assert(gtid.String(), check.Equals, cs.subGTIDs[domainID]) + require.Contains(t, mariadbGTIDSet.Sets, domainID) + require.Equal(t, cs.subGTIDs[domainID], gtid.String()) } } } -func (t *mariaDBTestSuite) TestMariaDBGTIDSetEqual(c *check.C) { +func TestMariaDBGTIDSetEqual(t *testing.T) { cases := []struct { originGTIDStr, otherGTIDStr string equals bool @@ -190,16 +179,16 @@ func (t *mariaDBTestSuite) TestMariaDBGTIDSetEqual(c *check.C) { for _, cs := range cases { originGTID, err := ParseMariadbGTIDSet(cs.originGTIDStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) otherGTID, err := ParseMariadbGTIDSet(cs.otherGTIDStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) - c.Assert(originGTID.Equal(otherGTID), check.Equals, cs.equals) + require.Equal(t, cs.equals, originGTID.Equal(otherGTID)) } } -func (t *mariaDBTestSuite) TestMariaDBGTIDSetContain(c *check.C) { +func TestMariaDBGTIDSetContain(t *testing.T) { cases := []struct { originGTIDStr, otherGTIDStr string contain bool @@ -214,33 +203,33 @@ func (t *mariaDBTestSuite) TestMariaDBGTIDSetContain(c *check.C) { for _, cs := range cases { originGTIDSet, err := ParseMariadbGTIDSet(cs.originGTIDStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) otherGTIDSet, err := ParseMariadbGTIDSet(cs.otherGTIDStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) - c.Assert(originGTIDSet.Contain(otherGTIDSet), check.Equals, cs.contain) + require.Equal(t, cs.contain, originGTIDSet.Contain(otherGTIDSet)) } } -func (t *mariaDBTestSuite) TestMariaDBGTIDSetClone(c *check.C) { +func TestMariaDBGTIDSetClone(t *testing.T) { cases := []string{"", "1-1-1", "1-1-1,2-2-2"} for _, str := range cases { gtidSet, err := ParseMariadbGTIDSet(str) - c.Assert(err, check.IsNil) + require.NoError(t, err) - c.Assert(gtidSet.Clone(), check.DeepEquals, gtidSet) + require.Equal(t, gtidSet, gtidSet.Clone()) } } -func (t *mariaDBTestSuite) TestMariaDBGTIDSetSortedString(c *check.C) { +func TestMariaDBGTIDSetSortedString(t *testing.T) { cases := [][]string{{"", ""}, {"1-1-1", "1-1-1"}, {"2-2-2,1-1-1,3-2-1", "1-1-1,2-2-2,3-2-1"}} for _, strs := range cases { gtidSet, err := ParseMariadbGTIDSet(strs[0]) - c.Assert(err, check.IsNil) - c.Assert(gtidSet.String(), check.Equals, strs[1]) + require.NoError(t, err) + require.Equal(t, strs[1], gtidSet.String()) } } diff --git a/mysql/mysql_test.go b/mysql/mysql_test.go index eb27aebfd..bf605e162 100644 --- a/mysql/mysql_test.go +++ b/mysql/mysql_test.go @@ -6,143 +6,126 @@ import ( "testing" "github.com/google/uuid" - "github.com/pingcap/check" + "github.com/stretchr/testify/require" _ "github.com/go-mysql-org/go-mysql/test_util" // Will register common flags ) -func Test(t *testing.T) { - check.TestingT(t) -} - -type mysqlTestSuite struct { -} - -var _ = check.Suite(&mysqlTestSuite{}) - -func (t *mysqlTestSuite) SetUpSuite(c *check.C) { - -} - -func (t *mysqlTestSuite) TearDownSuite(c *check.C) { - -} - -func (t *mysqlTestSuite) TestMysqlGTIDInterval(c *check.C) { +func TestMysqlGTIDInterval(t *testing.T) { i, err := parseInterval("1-2") - c.Assert(err, check.IsNil) - c.Assert(i, check.DeepEquals, Interval{1, 3}) + require.NoError(t, err) + require.Equal(t, Interval{1, 3}, i) i, err = parseInterval("1") - c.Assert(err, check.IsNil) - c.Assert(i, check.DeepEquals, Interval{1, 2}) + require.NoError(t, err) + require.Equal(t, Interval{1, 2}, i) i, err = parseInterval("1-1") - c.Assert(err, check.IsNil) - c.Assert(i, check.DeepEquals, Interval{1, 2}) + require.NoError(t, err) + require.Equal(t, Interval{1, 2}, i) } -func (t *mysqlTestSuite) TestMysqlGTIDIntervalSlice(c *check.C) { +func TestMysqlGTIDIntervalSlice(t *testing.T) { i := IntervalSlice{Interval{1, 2}, Interval{2, 4}, Interval{2, 3}} i.Sort() - c.Assert(i, check.DeepEquals, IntervalSlice{Interval{1, 2}, Interval{2, 3}, Interval{2, 4}}) + require.Equal(t, IntervalSlice{Interval{1, 2}, Interval{2, 3}, Interval{2, 4}}, i) n := i.Normalize() - c.Assert(n, check.DeepEquals, IntervalSlice{Interval{1, 4}}) + require.Equal(t, IntervalSlice{Interval{1, 4}}, n) i = IntervalSlice{Interval{1, 2}, Interval{3, 5}, Interval{1, 3}} i.Sort() - c.Assert(i, check.DeepEquals, IntervalSlice{Interval{1, 2}, Interval{1, 3}, Interval{3, 5}}) + require.Equal(t, IntervalSlice{Interval{1, 2}, Interval{1, 3}, Interval{3, 5}}, i) n = i.Normalize() - c.Assert(n, check.DeepEquals, IntervalSlice{Interval{1, 5}}) + require.Equal(t, IntervalSlice{Interval{1, 5}}, n) i = IntervalSlice{Interval{1, 2}, Interval{4, 5}, Interval{1, 3}} i.Sort() - c.Assert(i, check.DeepEquals, IntervalSlice{Interval{1, 2}, Interval{1, 3}, Interval{4, 5}}) + require.Equal(t, IntervalSlice{Interval{1, 2}, Interval{1, 3}, Interval{4, 5}}, i) n = i.Normalize() - c.Assert(n, check.DeepEquals, IntervalSlice{Interval{1, 3}, Interval{4, 5}}) + require.Equal(t, IntervalSlice{Interval{1, 3}, Interval{4, 5}}, n) i = IntervalSlice{Interval{1, 4}, Interval{2, 3}} i.Sort() - c.Assert(i, check.DeepEquals, IntervalSlice{Interval{1, 4}, Interval{2, 3}}) + require.Equal(t, IntervalSlice{Interval{1, 4}, Interval{2, 3}}, i) n = i.Normalize() - c.Assert(n, check.DeepEquals, IntervalSlice{Interval{1, 4}}) + require.Equal(t, IntervalSlice{Interval{1, 4}}, n) n1 := IntervalSlice{Interval{1, 3}, Interval{4, 5}} n2 := IntervalSlice{Interval{1, 2}} - c.Assert(n1.Contain(n2), check.Equals, true) - c.Assert(n2.Contain(n1), check.Equals, false) + require.True(t, n1.Contain(n2)) + require.False(t, n2.Contain(n1)) n1 = IntervalSlice{Interval{1, 3}, Interval{4, 5}} n2 = IntervalSlice{Interval{1, 6}} - c.Assert(n1.Contain(n2), check.Equals, false) - c.Assert(n2.Contain(n1), check.Equals, true) + require.False(t, n1.Contain(n2)) + require.True(t, n2.Contain(n1)) } -func (t *mysqlTestSuite) TestMysqlGTIDInsertInterval(c *check.C) { +func TestMysqlGTIDInsertInterval(t *testing.T) { i := IntervalSlice{Interval{100, 200}} i.InsertInterval(Interval{300, 400}) - c.Assert(i, check.DeepEquals, IntervalSlice{Interval{100, 200}, Interval{300, 400}}) + require.Equal(t, IntervalSlice{Interval{100, 200}, Interval{300, 400}}, i) i.InsertInterval(Interval{50, 70}) - c.Assert(i, check.DeepEquals, IntervalSlice{Interval{50, 70}, Interval{100, 200}, Interval{300, 400}}) + require.Equal(t, IntervalSlice{Interval{50, 70}, Interval{100, 200}, Interval{300, 400}}, i) i.InsertInterval(Interval{101, 201}) - c.Assert(i, check.DeepEquals, IntervalSlice{Interval{50, 70}, Interval{100, 201}, Interval{300, 400}}) + require.Equal(t, IntervalSlice{Interval{50, 70}, Interval{100, 201}, Interval{300, 400}}, i) i.InsertInterval(Interval{99, 202}) - c.Assert(i, check.DeepEquals, IntervalSlice{Interval{50, 70}, Interval{99, 202}, Interval{300, 400}}) + require.Equal(t, IntervalSlice{Interval{50, 70}, Interval{99, 202}, Interval{300, 400}}, i) i.InsertInterval(Interval{102, 302}) - c.Assert(i, check.DeepEquals, IntervalSlice{Interval{50, 70}, Interval{99, 400}}) + require.Equal(t, IntervalSlice{Interval{50, 70}, Interval{99, 400}}, i) i.InsertInterval(Interval{500, 600}) - c.Assert(i, check.DeepEquals, IntervalSlice{Interval{50, 70}, Interval{99, 400}, Interval{500, 600}}) + require.Equal(t, IntervalSlice{Interval{50, 70}, Interval{99, 400}, Interval{500, 600}}, i) i.InsertInterval(Interval{50, 100}) - c.Assert(i, check.DeepEquals, IntervalSlice{Interval{50, 400}, Interval{500, 600}}) + require.Equal(t, IntervalSlice{Interval{50, 400}, Interval{500, 600}}, i) i.InsertInterval(Interval{900, 1000}) - c.Assert(i, check.DeepEquals, IntervalSlice{Interval{50, 400}, Interval{500, 600}, Interval{900, 1000}}) + require.Equal(t, IntervalSlice{Interval{50, 400}, Interval{500, 600}, Interval{900, 1000}}, i) i.InsertInterval(Interval{1010, 1020}) - c.Assert(i, check.DeepEquals, IntervalSlice{Interval{50, 400}, Interval{500, 600}, Interval{900, 1000}, Interval{1010, 1020}}) + require.Equal(t, IntervalSlice{Interval{50, 400}, Interval{500, 600}, Interval{900, 1000}, Interval{1010, 1020}}, i) i.InsertInterval(Interval{49, 1000}) - c.Assert(i, check.DeepEquals, IntervalSlice{Interval{49, 1000}, Interval{1010, 1020}}) + require.Equal(t, IntervalSlice{Interval{49, 1000}, Interval{1010, 1020}}, i) i.InsertInterval(Interval{1, 1012}) - c.Assert(i, check.DeepEquals, IntervalSlice{Interval{1, 1020}}) + require.Equal(t, IntervalSlice{Interval{1, 1020}}, i) } -func (t *mysqlTestSuite) TestMysqlGTIDCodec(c *check.C) { +func TestMysqlGTIDCodec(t *testing.T) { us, err := ParseUUIDSet("de278ad0-2106-11e4-9f8e-6edd0ca20947:1-2") - c.Assert(err, check.IsNil) + require.NoError(t, err) - c.Assert(us.String(), check.Equals, "de278ad0-2106-11e4-9f8e-6edd0ca20947:1-2") + require.Equal(t, "de278ad0-2106-11e4-9f8e-6edd0ca20947:1-2", us.String()) buf := us.Encode() err = us.Decode(buf) - c.Assert(err, check.IsNil) + require.NoError(t, err) gs, err := ParseMysqlGTIDSet("de278ad0-2106-11e4-9f8e-6edd0ca20947:1-2,de278ad0-2106-11e4-9f8e-6edd0ca20948:1-2") - c.Assert(err, check.IsNil) + require.NoError(t, err) buf = gs.Encode() o, err := DecodeMysqlGTIDSet(buf) - c.Assert(err, check.IsNil) - c.Assert(gs, check.DeepEquals, o) + require.NoError(t, err) + require.Equal(t, gs, o) } -func (t *mysqlTestSuite) TestMysqlUpdate(c *check.C) { +func TestMysqlUpdate(t *testing.T) { g1, err := ParseMysqlGTIDSet("3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57") - c.Assert(err, check.IsNil) + require.NoError(t, err) err = g1.Update("3E11FA47-71CA-11E1-9E33-C80AA9429562:21-58") - c.Assert(err, check.IsNil) + require.NoError(t, err) - c.Assert(strings.ToUpper(g1.String()), check.Equals, "3E11FA47-71CA-11E1-9E33-C80AA9429562:21-58") + require.Equal(t, "3E11FA47-71CA-11E1-9E33-C80AA9429562:21-58", strings.ToUpper(g1.String())) g1, err = ParseMysqlGTIDSet(` 519CE70F-A893-11E9-A95A-B32DC65A7026:1-1154661, @@ -150,13 +133,13 @@ func (t *mysqlTestSuite) TestMysqlUpdate(c *check.C) { 802D69FD-A3B6-11E9-B1EA-50BAB55BA838:1-1221371, F2B50559-A891-11E9-B646-884FF0CA2043:1-479261 `) - c.Assert(err, check.IsNil) + require.NoError(t, err) err = g1.Update(` 802D69FD-A3B6-11E9-B1EA-50BAB55BA838:1221110-1221371, F2B50559-A891-11E9-B646-884FF0CA2043:478509-479266 `) - c.Assert(err, check.IsNil) + require.NoError(t, err) g2, err := ParseMysqlGTIDSet(` 519CE70F-A893-11E9-A95A-B32DC65A7026:1-1154661, @@ -164,51 +147,51 @@ func (t *mysqlTestSuite) TestMysqlUpdate(c *check.C) { 802D69FD-A3B6-11E9-B1EA-50BAB55BA838:1-1221371, F2B50559-A891-11E9-B646-884FF0CA2043:1-479266 `) - c.Assert(err, check.IsNil) - c.Assert(g2.Equal(g1), check.IsTrue) + require.NoError(t, err) + require.True(t, g1.Equal(g2)) } -func (t *mysqlTestSuite) TestMysqlAddGTID(c *check.C) { +func TestMysqlAddGTID(t *testing.T) { g, err := ParseMysqlGTIDSet("3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57") - c.Assert(err, check.IsNil) + require.NoError(t, err) g1 := g.(*MysqlGTIDSet) u, err := uuid.Parse("3E11FA47-71CA-11E1-9E33-C80AA9429562") - c.Assert(err, check.IsNil) + require.NoError(t, err) g1.AddGTID(u, 58) - c.Assert(strings.ToUpper(g1.String()), check.Equals, "3E11FA47-71CA-11E1-9E33-C80AA9429562:21-58") + require.Equal(t, "3E11FA47-71CA-11E1-9E33-C80AA9429562:21-58", strings.ToUpper(g1.String())) g1.AddGTID(u, 60) - c.Assert(strings.ToUpper(g1.String()), check.Equals, "3E11FA47-71CA-11E1-9E33-C80AA9429562:21-58:60") + require.Equal(t, "3E11FA47-71CA-11E1-9E33-C80AA9429562:21-58:60", strings.ToUpper(g1.String())) g1.AddGTID(u, 59) - c.Assert(strings.ToUpper(g1.String()), check.Equals, "3E11FA47-71CA-11E1-9E33-C80AA9429562:21-60") + require.Equal(t, "3E11FA47-71CA-11E1-9E33-C80AA9429562:21-60", strings.ToUpper(g1.String())) u2, err := uuid.Parse("519CE70F-A893-11E9-A95A-B32DC65A7026") - c.Assert(err, check.IsNil) + require.NoError(t, err) g1.AddGTID(u2, 58) g2, err := ParseMysqlGTIDSet(` 3E11FA47-71CA-11E1-9E33-C80AA9429562:21-60, 519CE70F-A893-11E9-A95A-B32DC65A7026:58 `) - c.Assert(err, check.IsNil) - c.Assert(g2.Equal(g1), check.IsTrue) + require.NoError(t, err) + require.True(t, g2.Equal(g1)) } -func (t *mysqlTestSuite) TestMysqlGTIDContain(c *check.C) { +func TestMysqlGTIDContain(t *testing.T) { g1, err := ParseMysqlGTIDSet("3E11FA47-71CA-11E1-9E33-C80AA9429562:23") - c.Assert(err, check.IsNil) + require.NoError(t, err) g2, err := ParseMysqlGTIDSet("3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57") - c.Assert(err, check.IsNil) + require.NoError(t, err) - c.Assert(g2.Contain(g1), check.Equals, true) - c.Assert(g1.Contain(g2), check.Equals, false) + require.True(t, g2.Contain(g1)) + require.False(t, g1.Contain(g2)) } -func (t *mysqlTestSuite) TestMysqlGTIDAdd(c *check.C) { +func TestMysqlGTIDAdd(t *testing.T) { testCases := []struct { left, right, expected string }{ @@ -221,18 +204,17 @@ func (t *mysqlTestSuite) TestMysqlGTIDAdd(c *check.C) { } for _, tc := range testCases { - m1 := t.mysqlGTIDfromString(c, tc.left) - m2 := t.mysqlGTIDfromString(c, tc.right) + m1 := mysqlGTIDfromString(t, tc.left) + m2 := mysqlGTIDfromString(t, tc.right) err := m1.Add(m2) - c.Assert(err, check.IsNil) - c.Assert( - fmt.Sprintf("%s + %s = %s", tc.left, tc.right, strings.ToUpper(m1.String())), - check.Equals, - fmt.Sprintf("%s + %s = %s", tc.left, tc.right, tc.expected)) + require.NoError(t, err) + one := fmt.Sprintf("%s + %s = %s", tc.left, tc.right, strings.ToUpper(m1.String())) + other := fmt.Sprintf("%s + %s = %s", tc.left, tc.right, tc.expected) + require.Equal(t, other, one) } } -func (t *mysqlTestSuite) TestMysqlGTIDMinus(c *check.C) { +func TestMysqlGTIDMinus(t *testing.T) { testCases := []struct { left, right, expected string }{ @@ -251,68 +233,67 @@ func (t *mysqlTestSuite) TestMysqlGTIDMinus(c *check.C) { } for _, tc := range testCases { - m1 := t.mysqlGTIDfromString(c, tc.left) - m2 := t.mysqlGTIDfromString(c, tc.right) + m1 := mysqlGTIDfromString(t, tc.left) + m2 := mysqlGTIDfromString(t, tc.right) err := m1.Minus(m2) - c.Assert(err, check.IsNil) - c.Assert( - fmt.Sprintf("%s - %s = %s", tc.left, tc.right, strings.ToUpper(m1.String())), - check.Equals, - fmt.Sprintf("%s - %s = %s", tc.left, tc.right, tc.expected)) + require.NoError(t, err) + one := fmt.Sprintf("%s - %s = %s", tc.left, tc.right, strings.ToUpper(m1.String())) + other := fmt.Sprintf("%s - %s = %s", tc.left, tc.right, tc.expected) + require.Equal(t, other, one) } } -func (t *mysqlTestSuite) TestMysqlParseBinaryInt8(c *check.C) { +func TestMysqlParseBinaryInt8(t *testing.T) { i8 := ParseBinaryInt8([]byte{128}) - c.Assert(i8, check.Equals, int8(-128)) + require.Equal(t, int8(-128), i8) } -func (t *mysqlTestSuite) TestMysqlParseBinaryUint8(c *check.C) { +func TestMysqlParseBinaryUint8(t *testing.T) { u8 := ParseBinaryUint8([]byte{128}) - c.Assert(u8, check.Equals, uint8(128)) + require.Equal(t, uint8(128), u8) } -func (t *mysqlTestSuite) TestMysqlParseBinaryInt16(c *check.C) { +func TestMysqlParseBinaryInt16(t *testing.T) { i16 := ParseBinaryInt16([]byte{1, 128}) - c.Assert(i16, check.Equals, int16(-128*256+1)) + require.Equal(t, int16(-128*256+1), i16) } -func (t *mysqlTestSuite) TestMysqlParseBinaryUint16(c *check.C) { +func TestMysqlParseBinaryUint16(t *testing.T) { u16 := ParseBinaryUint16([]byte{1, 128}) - c.Assert(u16, check.Equals, uint16(128*256+1)) + require.Equal(t, uint16(128*256+1), u16) } -func (t *mysqlTestSuite) TestMysqlParseBinaryInt24(c *check.C) { +func TestMysqlParseBinaryInt24(t *testing.T) { i32 := ParseBinaryInt24([]byte{1, 2, 128}) - c.Assert(i32, check.Equals, int32(-128*65536+2*256+1)) + require.Equal(t, int32(-128*65536+2*256+1), i32) } -func (t *mysqlTestSuite) TestMysqlParseBinaryUint24(c *check.C) { +func TestMysqlParseBinaryUint24(t *testing.T) { u32 := ParseBinaryUint24([]byte{1, 2, 128}) - c.Assert(u32, check.Equals, uint32(128*65536+2*256+1)) + require.Equal(t, uint32(128*65536+2*256+1), u32) } -func (t *mysqlTestSuite) TestMysqlParseBinaryInt32(c *check.C) { +func TestMysqlParseBinaryInt32(t *testing.T) { i32 := ParseBinaryInt32([]byte{1, 2, 3, 128}) - c.Assert(i32, check.Equals, int32(-128*16777216+3*65536+2*256+1)) + require.Equal(t, int32(-128*16777216+3*65536+2*256+1), i32) } -func (t *mysqlTestSuite) TestMysqlParseBinaryUint32(c *check.C) { +func TestMysqlParseBinaryUint32(t *testing.T) { u32 := ParseBinaryUint32([]byte{1, 2, 3, 128}) - c.Assert(u32, check.Equals, uint32(128*16777216+3*65536+2*256+1)) + require.Equal(t, uint32(128*16777216+3*65536+2*256+1), u32) } -func (t *mysqlTestSuite) TestMysqlParseBinaryInt64(c *check.C) { +func TestMysqlParseBinaryInt64(t *testing.T) { i64 := ParseBinaryInt64([]byte{1, 2, 3, 4, 5, 6, 7, 128}) - c.Assert(i64, check.Equals, -128*int64(72057594037927936)+7*int64(281474976710656)+6*int64(1099511627776)+5*int64(4294967296)+4*16777216+3*65536+2*256+1) + require.Equal(t, -128*int64(72057594037927936)+7*int64(281474976710656)+6*int64(1099511627776)+5*int64(4294967296)+4*16777216+3*65536+2*256+1, i64) } -func (t *mysqlTestSuite) TestMysqlParseBinaryUint64(c *check.C) { +func TestMysqlParseBinaryUint64(t *testing.T) { u64 := ParseBinaryUint64([]byte{1, 2, 3, 4, 5, 6, 7, 128}) - c.Assert(u64, check.Equals, 128*uint64(72057594037927936)+7*uint64(281474976710656)+6*uint64(1099511627776)+5*uint64(4294967296)+4*16777216+3*65536+2*256+1) + require.Equal(t, 128*uint64(72057594037927936)+7*uint64(281474976710656)+6*uint64(1099511627776)+5*uint64(4294967296)+4*16777216+3*65536+2*256+1, u64) } -func (t *mysqlTestSuite) TestErrorCode(c *check.C) { +func TestErrorCode(t *testing.T) { tbls := []struct { msg string code int @@ -324,35 +305,35 @@ func (t *mysqlTestSuite) TestErrorCode(c *check.C) { {"ERROR 1046 (3D000): Unknown error 1046", 1046}, } for _, v := range tbls { - c.Assert(ErrorCode(v.msg), check.Equals, v.code) + require.Equal(t, v.code, ErrorCode(v.msg)) } } -func (t *mysqlTestSuite) TestMysqlNullDecode(c *check.C) { +func TestMysqlNullDecode(t *testing.T) { _, isNull, n := LengthEncodedInt([]byte{0xfb}) - c.Assert(isNull, check.IsTrue) - c.Assert(n, check.Equals, 1) + require.True(t, isNull) + require.Equal(t, 1, n) } -func (t *mysqlTestSuite) TestMysqlUUIDClone(c *check.C) { +func TestMysqlUUIDClone(t *testing.T) { us, err := ParseUUIDSet("de278ad0-2106-11e4-9f8e-6edd0ca20947:1-2") - c.Assert(err, check.IsNil) - c.Assert(us.String(), check.Equals, "de278ad0-2106-11e4-9f8e-6edd0ca20947:1-2") + require.NoError(t, err) + require.Equal(t, "de278ad0-2106-11e4-9f8e-6edd0ca20947:1-2", us.String()) clone := us.Clone() - c.Assert(clone.String(), check.Equals, "de278ad0-2106-11e4-9f8e-6edd0ca20947:1-2") + require.Equal(t, "de278ad0-2106-11e4-9f8e-6edd0ca20947:1-2", clone.String()) } -func (t *mysqlTestSuite) TestMysqlEmptyDecode(c *check.C) { +func TestMysqlEmptyDecode(t *testing.T) { _, isNull, n := LengthEncodedInt(nil) - c.Assert(isNull, check.IsTrue) - c.Assert(n, check.Equals, 0) + require.True(t, isNull) + require.Equal(t, 0, n) } -func (t *mysqlTestSuite) mysqlGTIDfromString(c *check.C, gtidStr string) MysqlGTIDSet { +func mysqlGTIDfromString(t *testing.T, gtidStr string) MysqlGTIDSet { gtid, err := ParseMysqlGTIDSet(gtidStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) return *gtid.(*MysqlGTIDSet) } diff --git a/mysql/position_test.go b/mysql/position_test.go index aecf5d63b..401b03939 100644 --- a/mysql/position_test.go +++ b/mysql/position_test.go @@ -1,15 +1,12 @@ package mysql import ( - "github.com/pingcap/check" -) - -type positionCompareSuite struct { -} + "testing" -var _ = check.Suite(&positionCompareSuite{}) + "github.com/stretchr/testify/require" +) -func (t *positionCompareSuite) TestPosCompare(c *check.C) { +func TestPosCompare(t *testing.T) { ascendingPositions := []Position{ { "", @@ -42,10 +39,10 @@ func (t *positionCompareSuite) TestPosCompare(c *check.C) { } for i := 1; i < len(ascendingPositions); i++ { - c.Assert(ascendingPositions[i-1].Compare(ascendingPositions[i]), check.Equals, -1) + require.Equal(t, -1, ascendingPositions[i-1].Compare(ascendingPositions[i])) } for _, p := range ascendingPositions { - c.Assert(p.Compare(p), check.Equals, 0) + require.Equal(t, 0, p.Compare(p)) } } diff --git a/mysql/util_test.go b/mysql/util_test.go index 29a5b02e4..5851ed81e 100644 --- a/mysql/util_test.go +++ b/mysql/util_test.go @@ -1,15 +1,12 @@ package mysql import ( - "github.com/pingcap/check" -) - -type utilTestSuite struct { -} + "testing" -var _ = check.Suite(&utilTestSuite{}) + "github.com/stretchr/testify/require" +) -func (s *utilTestSuite) TestCompareServerVersions(c *check.C) { +func TestCompareServerVersions(t *testing.T) { tests := []struct { A string B string @@ -21,10 +18,8 @@ func (s *utilTestSuite) TestCompareServerVersions(c *check.C) { } for _, test := range tests { - comment := check.Commentf("%q vs. %q", test.A, test.B) - got, err := CompareServerVersions(test.A, test.B) - c.Assert(err, check.IsNil, comment) - c.Assert(got, check.Equals, test.Expect, comment) + require.NoError(t, err) + require.Equal(t, test.Expect, got) } } diff --git a/replication/backup_test.go b/replication/backup_test.go index 7293321af..b4e1e98b6 100644 --- a/replication/backup_test.go +++ b/replication/backup_test.go @@ -5,20 +5,19 @@ import ( "os" "time" - . "github.com/pingcap/check" - "github.com/pingcap/errors" + "github.com/stretchr/testify/require" "github.com/go-mysql-org/go-mysql/mysql" ) -func (t *testSyncerSuite) TestStartBackupEndInGivenTime(c *C) { - t.setupTest(c, mysql.MySQLFlavor) +func (t *testSyncerSuite) TestStartBackupEndInGivenTime() { + t.setupTest(mysql.MySQLFlavor) - t.testExecute(c, "RESET MASTER") + t.testExecute("RESET MASTER") for times := 1; times <= 2; times++ { - t.testSync(c, nil) - t.testExecute(c, "FLUSH LOGS") + t.testSync(nil) + t.testExecute("FLUSH LOGS") } binlogDir := "./var" @@ -30,7 +29,7 @@ func (t *testSyncerSuite) TestStartBackupEndInGivenTime(c *C) { go func() { err := t.b.StartBackup(binlogDir, mysql.Position{Name: "", Pos: uint32(0)}, timeout) - c.Assert(err, IsNil) + require.NoError(t.T(), err) done <- true }() failTimeout := 5 * timeout @@ -39,6 +38,6 @@ func (t *testSyncerSuite) TestStartBackupEndInGivenTime(c *C) { case <-done: return case <-ctx.Done(): - c.Assert(errors.New("time out error"), IsNil) + t.T().Fatal("time out error") } } diff --git a/replication/event_test.go b/replication/event_test.go index 509df8b5c..78bddc345 100644 --- a/replication/event_test.go +++ b/replication/event_test.go @@ -1,34 +1,36 @@ package replication import ( - . "github.com/pingcap/check" + "testing" + + "github.com/stretchr/testify/require" ) -func (_ *testDecodeSuite) TestMariadbGTIDListEvent(c *C) { +func TestMariadbGTIDListEvent(t *testing.T) { // single GTID, 1-2-3 data := []byte{1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0} ev := MariadbGTIDListEvent{} err := ev.Decode(data) - c.Assert(err, IsNil) - c.Assert(len(ev.GTIDs), Equals, 1) - c.Assert(ev.GTIDs[0].DomainID, Equals, uint32(1)) - c.Assert(ev.GTIDs[0].ServerID, Equals, uint32(2)) - c.Assert(ev.GTIDs[0].SequenceNumber, Equals, uint64(3)) + require.NoError(t, err) + require.Len(t, ev.GTIDs, 1) + require.Equal(t, uint32(1), ev.GTIDs[0].DomainID) + require.Equal(t, uint32(2), ev.GTIDs[0].ServerID) + require.Equal(t, uint64(3), ev.GTIDs[0].SequenceNumber) // multi GTIDs, 1-2-3,4-5-6,7-8-9 data = []byte{3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0} ev = MariadbGTIDListEvent{} err = ev.Decode(data) - c.Assert(err, IsNil) - c.Assert(len(ev.GTIDs), Equals, 3) + require.NoError(t, err) + require.Len(t, ev.GTIDs, 3) for i := 0; i < 3; i++ { - c.Assert(ev.GTIDs[i].DomainID, Equals, uint32(1+3*i)) - c.Assert(ev.GTIDs[i].ServerID, Equals, uint32(2+3*i)) - c.Assert(ev.GTIDs[i].SequenceNumber, Equals, uint64(3+3*i)) + require.Equal(t, uint32(1+3*i), ev.GTIDs[i].DomainID) + require.Equal(t, uint32(2+3*i), ev.GTIDs[i].ServerID) + require.Equal(t, uint64(3+3*i), ev.GTIDs[i].SequenceNumber) } } -func (_ *testDecodeSuite) TestMariadbGTIDEvent(c *C) { +func TestMariadbGTIDEvent(t *testing.T) { data := []byte{ 1, 2, 3, 4, 5, 6, 7, 8, // SequenceNumber 0x2a, 1, 0x3b, 4, // DomainID @@ -38,23 +40,23 @@ func (_ *testDecodeSuite) TestMariadbGTIDEvent(c *C) { ev := MariadbGTIDEvent{} err := ev.Decode(data) - c.Assert(err, IsNil) + require.NoError(t, err) - c.Assert(ev.GTID.SequenceNumber, Equals, uint64(0x0807060504030201)) - c.Assert(ev.GTID.DomainID, Equals, uint32(0x043b012a)) - c.Assert(ev.Flags, Equals, byte(0xff)) - c.Assert(ev.IsDDL(), Equals, true) - c.Assert(ev.IsStandalone(), Equals, true) - c.Assert(ev.IsGroupCommit(), Equals, true) - c.Assert(ev.CommitID, Equals, uint64(0x1716151413121110)) + require.Equal(t, uint64(0x0807060504030201), ev.GTID.SequenceNumber) + require.Equal(t, uint32(0x043b012a), ev.GTID.DomainID) + require.Equal(t, byte(0xff), ev.Flags) + require.True(t, ev.IsDDL()) + require.True(t, ev.IsStandalone()) + require.True(t, ev.IsGroupCommit()) + require.Equal(t, uint64(0x1716151413121110), ev.CommitID) } -func (_ *testDecodeSuite) TestGTIDEventMysql8NewFields(c *C) { +func TestGTIDEventMysql8NewFields(t *testing.T) { testcases := []struct { data []byte expectImmediateCommitTimestamp uint64 expectOriginalCommitTimestamp uint64 - expectTransactoinLength uint64 + expectTransactionLength uint64 expectImmediateServerVersion uint32 expectOriginalServerVersion uint32 }{ @@ -63,7 +65,7 @@ func (_ *testDecodeSuite) TestGTIDEventMysql8NewFields(c *C) { data: []byte("\x00Z\xa7*\u007fD\xa8\x11\xea\x94\u007f\x02B\xac\x19\x00\x02\x02\x01\x00\x00\x00\x00\x00\x00\x02v\x00\x00\x00\x00\x00\x00\x00w\x00\x00\x00\x00\x00\x00\x00\xc1G\x81\x16x\xa0\x85\x00\x00\x00\x00\x00\x00\x00\xfc\xc5\x03\x938\x01\x80\x00\x00\x00\x00"), expectImmediateCommitTimestamp: 1583812517644225, expectOriginalCommitTimestamp: 0, - expectTransactoinLength: 965, + expectTransactionLength: 965, expectImmediateServerVersion: 80019, expectOriginalServerVersion: 0, }, @@ -72,7 +74,7 @@ func (_ *testDecodeSuite) TestGTIDEventMysql8NewFields(c *C) { data: []byte("\x00Z\xa7*\u007fD\xa8\x11\xea\x94\u007f\x02B\xac\x19\x00\x02\x03\x01\x00\x00\x00\x00\x00\x00\x025\x00\x00\x00\x00\x00\x00\x006\x00\x00\x00\x00\x00\x00\x00"), expectImmediateCommitTimestamp: 0, expectOriginalCommitTimestamp: 0, - expectTransactoinLength: 0, + expectTransactionLength: 0, expectImmediateServerVersion: 0, expectOriginalServerVersion: 0, }, @@ -81,7 +83,7 @@ func (_ *testDecodeSuite) TestGTIDEventMysql8NewFields(c *C) { data: []byte("\x00\\\xcc\x103D\xa8\x11\xea\xbdY\x02B\xac\x19\x00\x03w\x00\x00\x00\x00\x00\x00\x00\x02x\x00\x00\x00\x00\x00\x00\x00y\x00\x00\x00\x00\x00\x00\x00j0\xb1>x\xa0\x05\xfc\xc3\x03\x938\x01\x00"), expectImmediateCommitTimestamp: 1583813191872618, expectOriginalCommitTimestamp: 1583813191872618, - expectTransactoinLength: 963, + expectTransactionLength: 963, expectImmediateServerVersion: 80019, expectOriginalServerVersion: 80019, }, @@ -90,28 +92,29 @@ func (_ *testDecodeSuite) TestGTIDEventMysql8NewFields(c *C) { for _, tc := range testcases { ev := new(GTIDEvent) err := ev.Decode(tc.data) - c.Assert(err, IsNil) - c.Assert(ev.ImmediateCommitTimestamp, Equals, tc.expectImmediateCommitTimestamp) - c.Assert(ev.OriginalCommitTimestamp, Equals, tc.expectOriginalCommitTimestamp) - c.Assert(ev.ImmediateServerVersion, Equals, tc.expectImmediateServerVersion) - c.Assert(ev.OriginalServerVersion, Equals, tc.expectOriginalServerVersion) + require.NoError(t, err) + require.Equal(t, tc.expectImmediateCommitTimestamp, ev.ImmediateCommitTimestamp) + require.Equal(t, tc.expectOriginalCommitTimestamp, ev.OriginalCommitTimestamp) + require.Equal(t, tc.expectTransactionLength, ev.TransactionLength) + require.Equal(t, tc.expectImmediateServerVersion, ev.ImmediateServerVersion) + require.Equal(t, tc.expectOriginalServerVersion, ev.OriginalServerVersion) } } -func (_ *testDecodeSuite) TestIntVarEvent(c *C) { +func TestIntVarEvent(t *testing.T) { // IntVarEvent Type LastInsertID, Value 13 data := []byte{1, 13, 0, 0, 0, 0, 0, 0, 0} ev := IntVarEvent{} err := ev.Decode(data) - c.Assert(err, IsNil) - c.Assert(ev.Type, Equals, LAST_INSERT_ID) - c.Assert(ev.Value, Equals, uint64(13)) + require.NoError(t, err) + require.Equal(t, LAST_INSERT_ID, ev.Type) + require.Equal(t, uint64(13), ev.Value) // IntVarEvent Type InsertID, Value 23 data = []byte{2, 23, 0, 0, 0, 0, 0, 0, 0} ev = IntVarEvent{} err = ev.Decode(data) - c.Assert(err, IsNil) - c.Assert(ev.Type, Equals, INSERT_ID) - c.Assert(ev.Value, Equals, uint64(23)) + require.NoError(t, err) + require.Equal(t, INSERT_ID, ev.Type) + require.Equal(t, uint64(23), ev.Value) } diff --git a/replication/parser_test.go b/replication/parser_test.go index 48137d700..d1774f8c7 100644 --- a/replication/parser_test.go +++ b/replication/parser_test.go @@ -2,11 +2,12 @@ package replication import ( "bytes" + "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -func (t *testSyncerSuite) TestIndexOutOfRange(c *C) { +func TestIndexOutOfRange(t *testing.T) { parser := NewBinlogParser() parser.format = &FormatDescriptionEvent{ @@ -40,10 +41,10 @@ func (t *testSyncerSuite) TestIndexOutOfRange(c *C) { 0x65, 0x6d, 0xb1, 0x3c, 0x38, 0xcb, }) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (t *testSyncerSuite) TestParseEvent(c *C) { +func TestParseEvent(t *testing.T) { parser := NewBinlogParser() parser.format = &FormatDescriptionEvent{ Version: 0x4, @@ -64,20 +65,20 @@ func (t *testSyncerSuite) TestParseEvent(c *C) { for _, tc := range testCases { r := bytes.NewReader(tc.byteData) _, err := parser.ParseSingleEvent(r, func(e *BinlogEvent) error { - c.Assert(e.Header.EventType, Equals, STOP_EVENT) - c.Assert(e.Header.EventSize, Equals, tc.eventSize) + require.Equal(t, STOP_EVENT, e.Header.EventType) + require.Equal(t, tc.eventSize, e.Header.EventSize) return nil }) - c.Assert(err, IsNil) + require.NoError(t, err) e, err2 := parser.Parse(tc.byteData) - c.Assert(e.Header.EventType, Equals, STOP_EVENT) - c.Assert(e.Header.EventSize, Equals, tc.eventSize) - c.Assert(err2, IsNil) + require.NoError(t, err2) + require.Equal(t, STOP_EVENT, e.Header.EventType) + require.Equal(t, tc.eventSize, e.Header.EventSize) } } -func (t *testSyncerSuite) TestRowsEventDecodeFunc(c *C) { +func TestRowsEventDecodeFunc(t *testing.T) { testCases := []struct { byteData []byte eventSize uint32 @@ -103,13 +104,13 @@ func (t *testSyncerSuite) TestRowsEventDecodeFunc(c *C) { }) for _, tc := range testCases { e, err := parser.Parse(tc.byteData) - c.Assert(err, IsNil) - c.Assert(e.Header.EventType, Equals, tc.eventType) - c.Assert(e.Header.EventSize, Equals, tc.eventSize) + require.NoError(t, err) + require.Equal(t, tc.eventType, e.Header.EventType) + require.Equal(t, tc.eventSize, e.Header.EventSize) } } -func (t *testSyncerSuite) TestRowsEventDecodeImageWithEmptyJSON(c *C) { +func TestRowsEventDecodeImageWithEmptyJSON(t *testing.T) { data := []byte("\x01\a\x00\xf6+\x0f\x00\xeb\xafP\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\xac\xfa\xbeÙ\xaf\xab1\x184\x11\x00\x00") bitmap := []byte{255} @@ -125,17 +126,17 @@ func (t *testSyncerSuite) TestRowsEventDecodeImageWithEmptyJSON(c *C) { ColumnCount: uint64(len(table.ColumnType)), } n, err := e.decodeImage(data, bitmap, EnumRowImageTypeUpdateAI) - c.Assert(err, IsNil) - c.Assert(n, Equals, len(data)) + require.NoError(t, err) + require.Len(t, data, n) - c.Assert(len(e.Rows), Equals, 1) - c.Assert(len(e.Rows[0]), Equals, len(table.ColumnType)) + require.Len(t, e.Rows, 1) + require.Len(t, e.Rows[0], len(table.ColumnType)) row := e.Rows[0] - c.Assert(row[0], Equals, int32(994294)) - c.Assert(row[1], Equals, int32(38842347)) - c.Assert(row[2], DeepEquals, []byte{}) // empty json - c.Assert(row[3], DeepEquals, []byte{}) // empty json - c.Assert(row[4], DeepEquals, []byte{}) // empty json - c.Assert(row[7], Equals, int32(4404)) + require.Equal(t, int32(994294), row[0]) + require.Equal(t, int32(38842347), row[1]) + require.Equal(t, []byte{}, row[2]) // empty json + require.Equal(t, []byte{}, row[3]) // empty json + require.Equal(t, []byte{}, row[4]) // empty json + require.Equal(t, int32(4404), row[7]) } diff --git a/replication/replication_test.go b/replication/replication_test.go index 0cb7512be..8b70f9e44 100644 --- a/replication/replication_test.go +++ b/replication/replication_test.go @@ -11,7 +11,8 @@ import ( "time" "github.com/google/uuid" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "github.com/go-mysql-org/go-mysql/client" "github.com/go-mysql-org/go-mysql/mysql" @@ -20,11 +21,8 @@ import ( var testOutputLogs = flag.Bool("out", false, "output binlog event") -func TestBinLogSyncer(t *testing.T) { - TestingT(t) -} - type testSyncerSuite struct { + suite.Suite b *BinlogSyncer c *client.Conn @@ -33,18 +31,11 @@ type testSyncerSuite struct { flavor string } -var _ = Suite(&testSyncerSuite{}) - -func (t *testSyncerSuite) SetUpSuite(c *C) { -} - -func (t *testSyncerSuite) TearDownSuite(c *C) { +func TestSyncerSuite(t *testing.T) { + suite.Run(t, new(testSyncerSuite)) } -func (t *testSyncerSuite) SetUpTest(c *C) { -} - -func (t *testSyncerSuite) TearDownTest(c *C) { +func (t *testSyncerSuite) TearDownTest() { if t.b != nil { t.b.Close() t.b = nil @@ -56,14 +47,12 @@ func (t *testSyncerSuite) TearDownTest(c *C) { } } -func (t *testSyncerSuite) testExecute(c *C, query string) { +func (t *testSyncerSuite) testExecute(query string) { _, err := t.c.Execute(query) - if err != nil { - c.Assert(fmt.Errorf("query %q execution failed: %w", query, err), IsNil) - } + require.NoError(t.T(), err) } -func (t *testSyncerSuite) testSync(c *C, s *BinlogStreamer) { +func (t *testSyncerSuite) testSync(s *BinlogStreamer) { t.wg.Add(1) go func() { defer t.wg.Done() @@ -81,7 +70,7 @@ func (t *testSyncerSuite) testSync(c *C, s *BinlogStreamer) { return } - c.Assert(err, IsNil) + require.NoError(t.T(), err) if *testOutputLogs { e.Dump(os.Stdout) @@ -91,10 +80,10 @@ func (t *testSyncerSuite) testSync(c *C, s *BinlogStreamer) { }() // use mixed format - t.testExecute(c, "SET SESSION binlog_format = 'MIXED'") + t.testExecute("SET SESSION binlog_format = 'MIXED'") str := `DROP TABLE IF EXISTS test_replication` - t.testExecute(c, str) + t.testExecute(str) str = `CREATE TABLE test_replication ( id BIGINT(64) UNSIGNED NOT NULL AUTO_INCREMENT, @@ -117,32 +106,32 @@ func (t *testSyncerSuite) testSync(c *C, s *BinlogStreamer) { PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8` - t.testExecute(c, str) + t.testExecute(str) // use row format - t.testExecute(c, "SET SESSION binlog_format = 'ROW'") + t.testExecute("SET SESSION binlog_format = 'ROW'") - t.testExecute(c, `INSERT INTO test_replication (str, f, i, e, b, y, da, ts, dt, tm, de, t, bb, se) + t.testExecute(`INSERT INTO test_replication (str, f, i, e, b, y, da, ts, dt, tm, de, t, bb, se) VALUES ("3", -3.14, 10, "e1", 0b0011, 1985, "2012-05-07", "2012-05-07 14:01:01", "2012-05-07 14:01:01", "14:01:01", -45363.64, "abc", "12345", "a,b")`) if t.flavor == mysql.MySQLFlavor { - t.testExecute(c, "SET SESSION binlog_row_image = 'MINIMAL'") + t.testExecute("SET SESSION binlog_row_image = 'MINIMAL'") if eq, err := t.c.CompareServerVersion("8.0.0"); (err == nil) && (eq >= 0) { - t.testExecute(c, "SET SESSION binlog_row_value_options = 'PARTIAL_JSON'") + t.testExecute("SET SESSION binlog_row_value_options = 'PARTIAL_JSON'") } const id = 100 - t.testExecute(c, fmt.Sprintf(`INSERT INTO test_replication (id, str, f, i, bb, de) VALUES (%d, "4", -3.14, 100, "abc", -45635.64)`, id)) - t.testExecute(c, fmt.Sprintf(`UPDATE test_replication SET f = -12.14, de = 555.34 WHERE id = %d`, id)) - t.testExecute(c, fmt.Sprintf(`DELETE FROM test_replication WHERE id = %d`, id)) + t.testExecute(fmt.Sprintf(`INSERT INTO test_replication (id, str, f, i, bb, de) VALUES (%d, "4", -3.14, 100, "abc", -45635.64)`, id)) + t.testExecute(fmt.Sprintf(`UPDATE test_replication SET f = -12.14, de = 555.34 WHERE id = %d`, id)) + t.testExecute(fmt.Sprintf(`DELETE FROM test_replication WHERE id = %d`, id)) } // check whether we can create the table including the json field str = `DROP TABLE IF EXISTS test_json` - t.testExecute(c, str) + t.testExecute(str) str = `CREATE TABLE test_json ( id BIGINT(64) UNSIGNED NOT NULL AUTO_INCREMENT, @@ -152,11 +141,11 @@ func (t *testSyncerSuite) testSync(c *C, s *BinlogStreamer) { ) ENGINE=InnoDB` if _, err := t.c.Execute(str); err == nil { - t.testExecute(c, `INSERT INTO test_json (c2) VALUES (1)`) - t.testExecute(c, `INSERT INTO test_json (c1, c2) VALUES ('{"key1": "value1", "key2": "value2"}', 1)`) + t.testExecute(`INSERT INTO test_json (c2) VALUES (1)`) + t.testExecute(`INSERT INTO test_json (c1, c2) VALUES ('{"key1": "value1", "key2": "value2"}', 1)`) } - t.testExecute(c, "DROP TABLE IF EXISTS test_json_v2") + t.testExecute("DROP TABLE IF EXISTS test_json_v2") str = `CREATE TABLE test_json_v2 ( id INT, @@ -210,7 +199,7 @@ func (t *testSyncerSuite) testSync(c *C, s *BinlogStreamer) { } for _, query := range tbls { - t.testExecute(c, query) + t.testExecute(query) } // "Partial Updates of JSON Values" from https://dev.mysql.com/doc/refman/8.0/en/json.html @@ -225,15 +214,15 @@ func (t *testSyncerSuite) testSync(c *C, s *BinlogStreamer) { // ToDo(atercattus): add more tests with JSON_REPLACE() and JSON_REMOVE() } for _, query := range tbls { - t.testExecute(c, query) + t.testExecute(query) } // If MySQL supports JSON, it must supports GEOMETRY. - t.testExecute(c, "DROP TABLE IF EXISTS test_geo") + t.testExecute("DROP TABLE IF EXISTS test_geo") str = `CREATE TABLE test_geo (g GEOMETRY)` _, err = t.c.Execute(str) - c.Assert(err, IsNil) + require.NoError(t.T(), err) tbls = []string{ `INSERT INTO test_geo VALUES (POINT(1, 1))`, @@ -242,15 +231,15 @@ func (t *testSyncerSuite) testSync(c *C, s *BinlogStreamer) { } for _, query := range tbls { - t.testExecute(c, query) + t.testExecute(query) } } str = `DROP TABLE IF EXISTS test_parse_time` - t.testExecute(c, str) + t.testExecute(str) // Must allow zero time. - t.testExecute(c, `SET sql_mode=''`) + t.testExecute(`SET sql_mode=''`) str = `CREATE TABLE test_parse_time ( a1 DATETIME, a2 DATETIME(3), @@ -258,9 +247,9 @@ func (t *testSyncerSuite) testSync(c *C, s *BinlogStreamer) { b1 TIMESTAMP, b2 TIMESTAMP(3) , b3 TIMESTAMP(6))` - t.testExecute(c, str) + t.testExecute(str) - t.testExecute(c, `INSERT INTO test_parse_time VALUES + t.testExecute(`INSERT INTO test_parse_time VALUES ("2014-09-08 17:51:04.123456", "2014-09-08 17:51:04.123456", "2014-09-08 17:51:04.123456", "2014-09-08 17:51:04.123456","2014-09-08 17:51:04.123456","2014-09-08 17:51:04.123456"), ("0000-00-00 00:00:00.000000", "0000-00-00 00:00:00.000000", "0000-00-00 00:00:00.000000", @@ -271,7 +260,7 @@ func (t *testSyncerSuite) testSync(c *C, s *BinlogStreamer) { t.wg.Wait() } -func (t *testSyncerSuite) setupTest(c *C, flavor string) { +func (t *testSyncerSuite) setupTest(flavor string) { var port uint16 = 3306 switch flavor { case mysql.MariaDBFlavor: @@ -287,14 +276,14 @@ func (t *testSyncerSuite) setupTest(c *C, flavor string) { t.c, err = client.Connect(fmt.Sprintf("%s:%d", *test_util.MysqlHost, port), "root", "", "") if err != nil { - c.Skip(err.Error()) + t.T().Skip(err.Error()) } _, err = t.c.Execute("CREATE DATABASE IF NOT EXISTS test") - c.Assert(err, IsNil) + require.NoError(t.T(), err) _, err = t.c.Execute("USE test") - c.Assert(err, IsNil) + require.NoError(t.T(), err) if t.b != nil { t.b.Close() @@ -313,29 +302,29 @@ func (t *testSyncerSuite) setupTest(c *C, flavor string) { t.b = NewBinlogSyncer(cfg) } -func (t *testSyncerSuite) testPositionSync(c *C) { +func (t *testSyncerSuite) testPositionSync() { // get current master binlog file and position r, err := t.c.Execute("SHOW MASTER STATUS") - c.Assert(err, IsNil) + require.NoError(t.T(), err) binFile, _ := r.GetString(0, 0) binPos, _ := r.GetInt(0, 1) s, err := t.b.StartSync(mysql.Position{Name: binFile, Pos: uint32(binPos)}) - c.Assert(err, IsNil) + require.NoError(t.T(), err) r, err = t.c.Execute("SHOW SLAVE HOSTS") - c.Assert(err, IsNil) + require.NoError(t.T(), err) // List of replicas must not be empty - c.Assert(r.Values, Not(HasLen), 0) + require.Greater(t.T(), len(r.Values), 0) // Slave_UUID is empty for mysql 8.0.28+ (8.0.32 still broken) if eq, err := t.c.CompareServerVersion("8.0.28"); (err == nil) && (eq < 0) { // check we have set Slave_UUID slaveUUID, _ := r.GetString(0, 4) - c.Assert(slaveUUID, HasLen, 36) + require.Len(t.T(), slaveUUID, 36) } else if err != nil { - c.Error("Cannot compare with server version: %w", err) + require.NoError(t.T(), err) } // Test re-sync. @@ -343,81 +332,81 @@ func (t *testSyncerSuite) testPositionSync(c *C) { _ = t.b.c.SetReadDeadline(time.Now().Add(time.Millisecond)) time.Sleep(100 * time.Millisecond) - t.testSync(c, s) + t.testSync(s) } -func (t *testSyncerSuite) TestMysqlPositionSync(c *C) { - t.setupTest(c, mysql.MySQLFlavor) - t.testPositionSync(c) +func (t *testSyncerSuite) TestMysqlPositionSync() { + t.setupTest(mysql.MySQLFlavor) + t.testPositionSync() } -func (t *testSyncerSuite) TestMysqlGTIDSync(c *C) { - t.setupTest(c, mysql.MySQLFlavor) +func (t *testSyncerSuite) TestMysqlGTIDSync() { + t.setupTest(mysql.MySQLFlavor) r, err := t.c.Execute("SELECT @@gtid_mode") - c.Assert(err, IsNil) + require.NoError(t.T(), err) modeOn, _ := r.GetString(0, 0) if modeOn != "ON" { - c.Skip("GTID mode is not ON") + t.T().Skip("GTID mode is not ON") } r, err = t.c.Execute("SHOW GLOBAL VARIABLES LIKE 'SERVER_UUID'") - c.Assert(err, IsNil) + require.NoError(t.T(), err) var masterUuid uuid.UUID if s, _ := r.GetString(0, 1); len(s) > 0 && s != "NONE" { masterUuid, err = uuid.Parse(s) - c.Assert(err, IsNil) + require.NoError(t.T(), err) } set, _ := mysql.ParseMysqlGTIDSet(fmt.Sprintf("%s:%d-%d", masterUuid.String(), 1, 2)) s, err := t.b.StartSyncGTID(set) - c.Assert(err, IsNil) + require.NoError(t.T(), err) - t.testSync(c, s) + t.testSync(s) } -func (t *testSyncerSuite) TestMariadbPositionSync(c *C) { - t.setupTest(c, mysql.MariaDBFlavor) +func (t *testSyncerSuite) TestMariadbPositionSync() { + t.setupTest(mysql.MariaDBFlavor) - t.testPositionSync(c) + t.testPositionSync() } -func (t *testSyncerSuite) TestMariadbGTIDSync(c *C) { - t.setupTest(c, mysql.MariaDBFlavor) +func (t *testSyncerSuite) TestMariadbGTIDSync() { + t.setupTest(mysql.MariaDBFlavor) // get current master gtid binlog pos r, err := t.c.Execute("SELECT @@gtid_binlog_pos") - c.Assert(err, IsNil) + require.NoError(t.T(), err) str, _ := r.GetString(0, 0) set, _ := mysql.ParseMariadbGTIDSet(str) s, err := t.b.StartSyncGTID(set) - c.Assert(err, IsNil) + require.NoError(t.T(), err) - t.testSync(c, s) + t.testSync(s) } -func (t *testSyncerSuite) TestMariadbAnnotateRows(c *C) { - t.setupTest(c, mysql.MariaDBFlavor) +func (t *testSyncerSuite) TestMariadbAnnotateRows() { + t.setupTest(mysql.MariaDBFlavor) t.b.cfg.DumpCommandFlag = BINLOG_SEND_ANNOTATE_ROWS_EVENT - t.testPositionSync(c) + t.testPositionSync() } -func (t *testSyncerSuite) TestMysqlSemiPositionSync(c *C) { - t.setupTest(c, mysql.MySQLFlavor) +func (t *testSyncerSuite) TestMysqlSemiPositionSync() { + t.setupTest(mysql.MySQLFlavor) t.b.cfg.SemiSyncEnabled = true - t.testPositionSync(c) + t.testPositionSync() } -func (t *testSyncerSuite) TestMysqlBinlogCodec(c *C) { - t.setupTest(c, mysql.MySQLFlavor) +func (t *testSyncerSuite) TestMysqlBinlogCodec() { + t.setupTest(mysql.MySQLFlavor) - t.testExecute(c, "RESET MASTER") + t.testExecute("RESET MASTER") var wg sync.WaitGroup wg.Add(1) @@ -426,11 +415,11 @@ func (t *testSyncerSuite) TestMysqlBinlogCodec(c *C) { go func() { defer wg.Done() - t.testSync(c, nil) + t.testSync(nil) - t.testExecute(c, "FLUSH LOGS") + t.testExecute("FLUSH LOGS") - t.testSync(c, nil) + t.testSync(nil) }() binlogDir := "./var" @@ -438,7 +427,7 @@ func (t *testSyncerSuite) TestMysqlBinlogCodec(c *C) { os.RemoveAll(binlogDir) err := t.b.StartBackup(binlogDir, mysql.Position{Name: "", Pos: uint32(0)}, 2*time.Second) - c.Assert(err, IsNil) + require.NoError(t.T(), err) p := NewBinlogParser() p.SetVerifyChecksum(true) @@ -452,14 +441,14 @@ func (t *testSyncerSuite) TestMysqlBinlogCodec(c *C) { } dir, err := os.Open(binlogDir) - c.Assert(err, IsNil) + require.NoError(t.T(), err) defer dir.Close() files, err := dir.Readdirnames(-1) - c.Assert(err, IsNil) + require.NoError(t.T(), err) for _, file := range files { err = p.ParseFile(path.Join(binlogDir, file), 0, f) - c.Assert(err, IsNil) + require.NoError(t.T(), err) } } diff --git a/replication/row_event_test.go b/replication/row_event_test.go index 13114b464..8d71bf017 100644 --- a/replication/row_event_test.go +++ b/replication/row_event_test.go @@ -1,69 +1,15 @@ package replication import ( - "fmt" + "testing" - . "github.com/pingcap/check" "github.com/shopspring/decimal" + "github.com/stretchr/testify/require" "github.com/go-mysql-org/go-mysql/mysql" ) -type testDecodeSuite struct{} - -var _ = Suite(&testDecodeSuite{}) - -type decodeDecimalChecker struct { - *CheckerInfo -} - -func (_ *decodeDecimalChecker) Check(params []interface{}, names []string) (bool, string) { - var test int - val := struct { - Value decimal.Decimal - Pos int - Err error - EValue decimal.Decimal - EPos int - EErr error - }{} - - for i, name := range names { - switch name { - case "obtainedValue": - val.Value, _ = params[i].(decimal.Decimal) - case "obtainedPos": - val.Pos, _ = params[i].(int) - case "obtainedErr": - val.Err, _ = params[i].(error) - case "expectedValue": - val.EValue, _ = params[i].(decimal.Decimal) - case "expectedPos": - val.EPos, _ = params[i].(int) - case "expectedErr": - val.EErr, _ = params[i].(error) - case "caseNumber": - test = params[i].(int) - } - } - errorMsgFmt := fmt.Sprintf("For Test %v: ", test) + "Did not get expected %v(%v), got %v instead." - if val.Err != val.EErr { - return false, fmt.Sprintf(errorMsgFmt, "error", val.EErr, val.Err) - } - if val.Pos != val.EPos { - return false, fmt.Sprintf(errorMsgFmt, "position", val.EPos, val.Pos) - } - if !val.Value.Equal(val.EValue) { - return false, fmt.Sprintf(errorMsgFmt, "value", val.EValue, val.Value) - } - return true, "" -} - -var DecodeDecimalsEquals = &decodeDecimalChecker{ - &CheckerInfo{Name: "Equals", Params: []string{"obtainedValue", "obtainedPos", "obtainedErr", "expectedValue", "expectedPos", "expectedErr", "caseNumber"}}, -} - -func (_ *testDecodeSuite) TestDecodeDecimal(c *C) { +func TestDecodeDecimal(t *testing.T) { // _PLACEHOLDER_ := 0 testcases := []struct { Data []byte @@ -324,17 +270,21 @@ func (_ *testDecodeSuite) TestDecodeDecimal(c *C) { {[]byte{127, 255, 255, 248, 99, 247, 167, 196, 255, 255, 255, 255, 255, 255, 127, 248}, 30, 20, "-1948.14000000000000000000", 14, nil}, {[]byte{127, 248, 99, 247, 167, 196, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 0}, 30, 25, "-1948.1400000000000000000000000", 15, nil}, } - for i, tc := range testcases { + for _, tc := range testcases { value, pos, err := decodeDecimal(tc.Data, tc.Precision, tc.Decimals, false) - c.Assert(value.(string), DecodeDecimalsEquals, pos, err, tc.Expected, tc.ExpectedPos, tc.ExpectedErr, i) + require.Equal(t, tc.Expected, value.(string)) + require.Equal(t, tc.ExpectedPos, pos) + require.Equal(t, tc.ExpectedErr, err) value, pos, err = decodeDecimal(tc.Data, tc.Precision, tc.Decimals, true) expectedDecimal, _ := decimal.NewFromString(tc.Expected) - c.Assert(value.(decimal.Decimal), DecodeDecimalsEquals, pos, err, expectedDecimal, tc.ExpectedPos, tc.ExpectedErr, i) + require.True(t, expectedDecimal.Equal(value.(decimal.Decimal))) + require.Equal(t, tc.ExpectedPos, pos) + require.Equal(t, tc.ExpectedErr, err) } } -func (_ *testDecodeSuite) TestLastNull(c *C) { +func TestLastNull(t *testing.T) { // Table format: // desc funnytable; // +-------+------------+------+-----+---------+-------+ @@ -352,7 +302,7 @@ func (_ *testDecodeSuite) TestLastNull(c *C) { tableMapEvent := new(TableMapEvent) tableMapEvent.tableIDSize = 6 err := tableMapEvent.Decode(tableMapEventData) - c.Assert(err, IsNil) + require.NoError(t, err) rows := new(RowsEvent) rows.tableIDSize = 6 @@ -368,12 +318,12 @@ func (_ *testDecodeSuite) TestLastNull(c *C) { for _, tbl := range tbls { rows.Rows = nil err = rows.Decode(tbl) - c.Assert(err, IsNil) - c.Assert(rows.Rows, HasLen, 3) + require.NoError(t, err) + require.Len(t, rows.Rows, 3) } } -func (_ *testDecodeSuite) TestParseRowPanic(c *C) { +func TestParseRowPanic(t *testing.T) { tableMapEvent := new(TableMapEvent) tableMapEvent.tableIDSize = 6 tableMapEvent.TableID = 1810 @@ -389,30 +339,11 @@ func (_ *testDecodeSuite) TestParseRowPanic(c *C) { data := []byte{18, 7, 0, 0, 0, 0, 1, 0, 2, 0, 26, 1, 1, 16, 252, 248, 142, 63, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0} err := rows.Decode(data) - c.Assert(err, IsNil) - c.Assert(rows.Rows[0][0], Equals, int32(16270)) -} - -type simpleDecimalEqualsChecker struct { - *CheckerInfo -} - -var SimpleDecimalEqualsChecker Checker = &simpleDecimalEqualsChecker{ - &CheckerInfo{Name: "Equals", Params: []string{"obtained", "expected"}}, -} - -func (checker *simpleDecimalEqualsChecker) Check(params []interface{}, names []string) (result bool, error string) { - defer func() { - if v := recover(); v != nil { - result = false - error = fmt.Sprint(v) - } - }() - - return params[0].(decimal.Decimal).Equal(params[1].(decimal.Decimal)), "" + require.NoError(t, err) + require.Equal(t, int32(16270), rows.Rows[0][0]) } -func (_ *testDecodeSuite) TestParseJson(c *C) { +func TestParseJson(t *testing.T) { // Table format: // mysql> desc t10; // +-------+---------------+------+-----+---------+-------+ @@ -437,7 +368,7 @@ func (_ *testDecodeSuite) TestParseJson(c *C) { tableMapEvent := new(TableMapEvent) tableMapEvent.tableIDSize = 6 err := tableMapEvent.Decode(tableMapEventData) - c.Assert(err, IsNil) + require.NoError(t, err) rows := new(RowsEvent) rows.tableIDSize = 6 @@ -453,8 +384,8 @@ func (_ *testDecodeSuite) TestParseJson(c *C) { for _, tbl := range tbls { rows.Rows = nil err = rows.Decode(tbl) - c.Assert(err, IsNil) - c.Assert(rows.Rows[0][1], Equals, "1") + require.NoError(t, err) + require.Equal(t, "1", rows.Rows[0][1]) } //nolint:misspell @@ -465,11 +396,11 @@ func (_ *testDecodeSuite) TestParseJson(c *C) { for _, ltbl := range longTbls { rows.Rows = nil err = rows.Decode(ltbl) - c.Assert(err, IsNil) - c.Assert(rows.Rows[0][1], Equals, "101") + require.NoError(t, err) + require.Equal(t, "101", rows.Rows[0][1]) } } -func (_ *testDecodeSuite) TestParseJsonDecimal(c *C) { +func TestParseJsonDecimal(t *testing.T) { // Table format: // mysql> desc t10; // +-------+---------------+------+-----+---------+-------+ @@ -494,7 +425,7 @@ func (_ *testDecodeSuite) TestParseJsonDecimal(c *C) { tableMapEvent := new(TableMapEvent) tableMapEvent.tableIDSize = 6 err := tableMapEvent.Decode(tableMapEventData) - c.Assert(err, IsNil) + require.NoError(t, err) rows := RowsEvent{useDecimal: true} rows.tableIDSize = 6 @@ -510,8 +441,8 @@ func (_ *testDecodeSuite) TestParseJsonDecimal(c *C) { for _, tbl := range tbls { rows.Rows = nil err = rows.Decode(tbl) - c.Assert(err, IsNil) - c.Assert(rows.Rows[0][1], SimpleDecimalEqualsChecker, decimal.NewFromFloat(1)) + require.NoError(t, err) + require.True(t, rows.Rows[0][1].(decimal.Decimal).Equal(decimal.NewFromFloat(1))) } //nolint:misspell @@ -522,12 +453,12 @@ func (_ *testDecodeSuite) TestParseJsonDecimal(c *C) { for _, ltbl := range longTbls { rows.Rows = nil err = rows.Decode(ltbl) - c.Assert(err, IsNil) - c.Assert(rows.Rows[0][1], SimpleDecimalEqualsChecker, decimal.NewFromFloat(101)) + require.NoError(t, err) + require.True(t, rows.Rows[0][1].(decimal.Decimal).Equal(decimal.NewFromFloat(101))) } } -func (_ *testDecodeSuite) TestEnum(c *C) { +func TestEnum(t *testing.T) { // mysql> desc aenum; // +-------+-------------------------------------------+------+-----+---------+-------+ // | Field | Type | Null | Key | Default | Extra | @@ -543,7 +474,7 @@ func (_ *testDecodeSuite) TestEnum(c *C) { tableMapEvent := new(TableMapEvent) tableMapEvent.tableIDSize = 6 err := tableMapEvent.Decode(tableMapEventData) - c.Assert(err, IsNil) + require.NoError(t, err) rows := new(RowsEvent) rows.tableIDSize = 6 @@ -555,11 +486,11 @@ func (_ *testDecodeSuite) TestEnum(c *C) { rows.Rows = nil err = rows.Decode(data) - c.Assert(err, IsNil) - c.Assert(rows.Rows[0][1], Equals, int64(1)) + require.NoError(t, err) + require.Equal(t, int64(1), rows.Rows[0][1]) } -func (_ *testDecodeSuite) TestMultiBytesEnum(c *C) { +func TestMultiBytesEnum(t *testing.T) { // CREATE TABLE numbers ( // id int auto_increment, // num ENUM( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', '115', '116', '117', '118', '119', '120', '121', '122', '123', '124', '125', '126', '127', '128', '129', '130', '131', '132', '133', '134', '135', '136', '137', '138', '139', '140', '141', '142', '143', '144', '145', '146', '147', '148', '149', '150', '151', '152', '153', '154', '155', '156', '157', '158', '159', '160', '161', '162', '163', '164', '165', '166', '167', '168', '169', '170', '171', '172', '173', '174', '175', '176', '177', '178', '179', '180', '181', '182', '183', '184', '185', '186', '187', '188', '189', '190', '191', '192', '193', '194', '195', '196', '197', '198', '199', '200', '201', '202', '203', '204', '205', '206', '207', '208', '209', '210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '220', '221', '222', '223', '224', '225', '226', '227', '228', '229', '230', '231', '232', '233', '234', '235', '236', '237', '238', '239', '240', '241', '242', '243', '244', '245', '246', '247', '248', '249', '250', '251', '252', '253', '254', '255','256','257' @@ -575,7 +506,7 @@ func (_ *testDecodeSuite) TestMultiBytesEnum(c *C) { tableMapEvent := new(TableMapEvent) tableMapEvent.tableIDSize = 6 err := tableMapEvent.Decode(tableMapEventData) - c.Assert(err, IsNil) + require.NoError(t, err) rows := new(RowsEvent) rows.tableIDSize = 6 @@ -587,12 +518,12 @@ func (_ *testDecodeSuite) TestMultiBytesEnum(c *C) { rows.Rows = nil err = rows.Decode(data) - c.Assert(err, IsNil) - c.Assert(rows.Rows[0][1], Equals, int64(1)) - c.Assert(rows.Rows[1][1], Equals, int64(257)) + require.NoError(t, err) + require.Equal(t, int64(1), rows.Rows[0][1]) + require.Equal(t, int64(257), rows.Rows[1][1]) } -func (_ *testDecodeSuite) TestSet(c *C) { +func TestSet(t *testing.T) { // mysql> desc aset; // +--------+---------------------------------------------------------------------------------------+------+-----+---------+-------+ // | Field | Type | Null | Key | Default | Extra | @@ -609,7 +540,7 @@ func (_ *testDecodeSuite) TestSet(c *C) { tableMapEvent := new(TableMapEvent) tableMapEvent.tableIDSize = 6 err := tableMapEvent.Decode(tableMapEventData) - c.Assert(err, IsNil) + require.NoError(t, err) rows := new(RowsEvent) rows.tableIDSize = 6 @@ -621,11 +552,11 @@ func (_ *testDecodeSuite) TestSet(c *C) { rows.Rows = nil err = rows.Decode(data) - c.Assert(err, IsNil) - c.Assert(rows.Rows[0][1], Equals, int64(5)) + require.NoError(t, err) + require.Equal(t, int64(5), rows.Rows[0][1]) } -func (_ *testDecodeSuite) TestJsonNull(c *C) { +func TestJsonNull(t *testing.T) { // Table: // desc hj_order_preview // +------------------+------------+------+-----+-------------------+----------------+ @@ -648,7 +579,7 @@ func (_ *testDecodeSuite) TestJsonNull(c *C) { tableMapEvent := new(TableMapEvent) tableMapEvent.tableIDSize = 6 err := tableMapEvent.Decode(tableMapEventData) - c.Assert(err, IsNil) + require.NoError(t, err) rows := new(RowsEvent) rows.tableIDSize = 6 @@ -661,11 +592,11 @@ func (_ *testDecodeSuite) TestJsonNull(c *C) { rows.Rows = nil err = rows.Decode(data) - c.Assert(err, IsNil) - c.Assert(rows.Rows[0][3], HasLen, 0) + require.NoError(t, err) + require.Len(t, rows.Rows[0][3], 0) } -func (_ *testDecodeSuite) TestJsonCompatibility(c *C) { +func TestJsonCompatibility(t *testing.T) { // Table: // mysql> desc t11; // +----------+--------------+------+-----+---------+-------------------+ @@ -687,7 +618,7 @@ func (_ *testDecodeSuite) TestJsonCompatibility(c *C) { tableMapEvent := new(TableMapEvent) tableMapEvent.tableIDSize = 6 err := tableMapEvent.Decode(tableMapEventData) - c.Assert(err, IsNil) + require.NoError(t, err) rows := new(RowsEvent) rows.tableIDSize = 6 @@ -698,44 +629,44 @@ func (_ *testDecodeSuite) TestJsonCompatibility(c *C) { data := []byte("l\x00\x00\x00\x00\x00\x01\x00\x02\x00\x04\xff\xf8\x01\x00\x00\x00\x02{}\x05\x00\x00\x00\x00\x00\x00\x04\x00") rows.Rows = nil err = rows.Decode(data) - c.Assert(err, IsNil) - c.Assert(rows.Rows[0][2], DeepEquals, "{}") + require.NoError(t, err) + require.Equal(t, "{}", rows.Rows[0][2]) // after MySQL 5.7.22 data = []byte("l\x00\x00\x00\x00\x00\x01\x00\x02\x00\x04\xff\xff\xf8\x01\x00\x00\x00\x02{}\x05\x00\x00\x00\x00\x00\x00\x04\x00\xf8\x01\x00\x00\x00\n{\"a\":1234}\r\x00\x00\x00\x00\x01\x00\x0c\x00\x0b\x00\x01\x00\x05\xd2\x04a") rows.Rows = nil err = rows.Decode(data) - c.Assert(err, IsNil) - c.Assert(rows.Rows[1][2], DeepEquals, "{}") - c.Assert(rows.Rows[2][2], DeepEquals, "{\"a\":1234}") + require.NoError(t, err) + require.Equal(t, "{}", rows.Rows[1][2]) + require.Equal(t, "{\"a\":1234}", rows.Rows[2][2]) data = []byte("l\x00\x00\x00\x00\x00\x01\x00\x02\x00\x04\xff\xff\xf8\x01\x00\x00\x00\n{\"a\":1234}\r\x00\x00\x00\x00\x01\x00\x0c\x00\x0b\x00\x01\x00\x05\xd2\x04a\xf8\x01\x00\x00\x00\x02{}\x05\x00\x00\x00\x00\x00\x00\x04\x00") rows.Rows = nil err = rows.Decode(data) - c.Assert(err, IsNil) - c.Assert(rows.Rows[1][2], DeepEquals, "{\"a\":1234}") - c.Assert(rows.Rows[2][2], DeepEquals, "{}") + require.NoError(t, err) + require.Equal(t, "{\"a\":1234}", rows.Rows[1][2]) + require.Equal(t, "{}", rows.Rows[2][2]) // before MySQL 5.7.22 rows.ignoreJSONDecodeErr = true data = []byte("l\x00\x00\x00\x00\x00\x01\x00\x02\x00\x04\xff\xff\xf8\x01\x00\x00\x00\x02{}\x05\x00\x00\x00\x00\x01\x00\x0c\x00\xf8\x01\x00\x00\x00\n{\"a\":1234}\r\x00\x00\x00\x00\x01\x00\x0c\x00\x0b\x00\x01\x00\x05\xd2\x04a") rows.Rows = nil err = rows.Decode(data) - c.Assert(err, IsNil) - c.Assert(rows.Rows[1][2], DeepEquals, "null") - c.Assert(rows.Rows[2][2], DeepEquals, "{\"a\":1234}") + require.NoError(t, err) + require.Equal(t, "null", rows.Rows[1][2]) + require.Equal(t, "{\"a\":1234}", rows.Rows[2][2]) rows.ignoreJSONDecodeErr = false data = []byte("l\x00\x00\x00\x00\x00\x01\x00\x02\x00\x04\xff\xff\xf8\x01\x00\x00\x00\n{\"a\":1234}\r\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x01\x00\x05\xd2\x04a\xf8\x01\x00\x00\x00\x02{}\x05\x00\x00\x00\x00\x00\x00\x04\x00") rows.Rows = nil err = rows.Decode(data) - c.Assert(err, IsNil) + require.NoError(t, err) // this value is wrong in binlog, but can be parsed without error - c.Assert(rows.Rows[1][2], DeepEquals, "{}") - c.Assert(rows.Rows[2][2], DeepEquals, "{}") + require.Equal(t, "{}", rows.Rows[1][2]) + require.Equal(t, "{}", rows.Rows[2][2]) } -func (_ *testDecodeSuite) TestDecodeDatetime2(c *C) { +func TestDecodeDatetime2(t *testing.T) { testcases := []struct { data []byte dec uint16 @@ -754,21 +685,21 @@ func (_ *testDecodeSuite) TestDecodeDatetime2(c *C) { } for _, tc := range testcases { value, _, err := decodeDatetime2(tc.data, tc.dec) - c.Assert(err, IsNil) - switch t := value.(type) { + require.NoError(t, err) + switch v := value.(type) { case fracTime: - c.Assert(tc.getFracTime, IsTrue) - c.Assert(t.String(), Equals, tc.expected) + require.True(t, tc.getFracTime) + require.Equal(t, tc.expected, v.String()) case string: - c.Assert(tc.getFracTime, IsFalse) - c.Assert(t, Equals, tc.expected) + require.False(t, tc.getFracTime) + require.Equal(t, tc.expected, v) default: - c.Errorf("invalid value type: %T", value) + require.FailNow(t, "invalid value type: %T", value) } } } -func (_ *testDecodeSuite) TestTableMapNullable(c *C) { +func TestTableMapNullable(t *testing.T) { /* create table _null (c1 int null, c2 int not null default '2', c3 timestamp default now(), c4 text); */ @@ -788,17 +719,17 @@ func (_ *testDecodeSuite) TestTableMapNullable(c *C) { tableMapEvent := new(TableMapEvent) tableMapEvent.tableIDSize = 6 err := tableMapEvent.Decode(tc) - c.Assert(err, IsNil) - c.Assert(int(tableMapEvent.ColumnCount), Equals, len(nullables)) + require.NoError(t, err) + require.Equal(t, int(tableMapEvent.ColumnCount), len(nullables)) for i := 0; i < int(tableMapEvent.ColumnCount); i++ { available, nullable := tableMapEvent.Nullable(i) - c.Assert(available, Equals, true) - c.Assert(nullable, Equals, nullables[i]) + require.True(t, available) + require.Equal(t, nullables[i], nullable) } } } -func (_ *testDecodeSuite) TestTableMapOptMetaNames(c *C) { +func TestTableMapOptMetaNames(t *testing.T) { /* CREATE TABLE `_types` ( `b_bit` bit(64) NOT NULL DEFAULT b'0', @@ -916,21 +847,21 @@ func (_ *testDecodeSuite) TestTableMapOptMetaNames(c *C) { tableMapEvent := new(TableMapEvent) tableMapEvent.tableIDSize = 6 err := tableMapEvent.Decode(tc.data) - c.Assert(err, IsNil) + require.NoError(t, err) if tc.hasNames { - c.Assert(tableMapEvent.ColumnNameString(), DeepEquals, colNames) - c.Assert(tableMapEvent.SetStrValueString(), DeepEquals, setVals) - c.Assert(tableMapEvent.EnumStrValueString(), DeepEquals, enumVals) + require.Equal(t, colNames, tableMapEvent.ColumnNameString()) + require.Equal(t, setVals, tableMapEvent.SetStrValueString()) + require.Equal(t, enumVals, tableMapEvent.EnumStrValueString()) } else { - c.Assert(tableMapEvent.ColumnNameString(), DeepEquals, []string(nil)) - c.Assert(tableMapEvent.SetStrValueString(), DeepEquals, [][]string(nil)) - c.Assert(tableMapEvent.EnumStrValueString(), DeepEquals, [][]string(nil)) + require.Equal(t, []string(nil), tableMapEvent.ColumnNameString()) + require.Equal(t, [][]string(nil), tableMapEvent.SetStrValueString()) + require.Equal(t, [][]string(nil), tableMapEvent.EnumStrValueString()) } } } -func (_ *testDecodeSuite) TestTableMapOptMetaPrimaryKey(c *C) { +func TestTableMapOptMetaPrimaryKey(t *testing.T) { /* create table _prim (id2 int, col varchar(30), id1 bigint, primary key (id1, id2)); */ @@ -1002,13 +933,13 @@ func (_ *testDecodeSuite) TestTableMapOptMetaPrimaryKey(c *C) { tableMapEvent := new(TableMapEvent) tableMapEvent.tableIDSize = 6 err := tableMapEvent.Decode(tc.data) - c.Assert(err, IsNil) - c.Assert(tableMapEvent.PrimaryKey, DeepEquals, tc.expectedPrimaryKey) - c.Assert(tableMapEvent.PrimaryKeyPrefix, DeepEquals, tc.expectedPrimaryKeyPrefix) + require.NoError(t, err) + require.Equal(t, tc.expectedPrimaryKey, tableMapEvent.PrimaryKey) + require.Equal(t, tc.expectedPrimaryKeyPrefix, tableMapEvent.PrimaryKeyPrefix) } } -func (_ *testDecodeSuite) TestTableMapHelperMaps(c *C) { +func TestTableMapHelperMaps(t *testing.T) { /* CREATE TABLE `_types` ( `b_bit` bit(64) NOT NULL DEFAULT b'0', @@ -1175,17 +1106,17 @@ func (_ *testDecodeSuite) TestTableMapHelperMaps(c *C) { tableMapEvent.flavor = tc.flavor tableMapEvent.tableIDSize = 6 err := tableMapEvent.Decode(tc.data) - c.Assert(err, IsNil) - c.Assert(tableMapEvent.UnsignedMap(), DeepEquals, tc.unsignedMap) - c.Assert(tableMapEvent.CollationMap(), DeepEquals, tc.collationMap) - c.Assert(tableMapEvent.EnumSetCollationMap(), DeepEquals, tc.enumSetCollationMap) - c.Assert(tableMapEvent.EnumStrValueMap(), DeepEquals, tc.enumStrValueMap) - c.Assert(tableMapEvent.SetStrValueMap(), DeepEquals, tc.setStrValueMap) - c.Assert(tableMapEvent.GeometryTypeMap(), DeepEquals, tc.geometryTypeMap) + require.NoError(t, err) + require.Equal(t, tc.unsignedMap, tableMapEvent.UnsignedMap()) + require.Equal(t, tc.collationMap, tableMapEvent.CollationMap()) + require.Equal(t, tc.enumSetCollationMap, tableMapEvent.EnumSetCollationMap()) + require.Equal(t, tc.enumStrValueMap, tableMapEvent.EnumStrValueMap()) + require.Equal(t, tc.setStrValueMap, tableMapEvent.SetStrValueMap()) + require.Equal(t, tc.geometryTypeMap, tableMapEvent.GeometryTypeMap()) } } -func (_ *testDecodeSuite) TestInvalidEvent(c *C) { +func TestInvalidEvent(t *testing.T) { data := "@\x01\x00\x00\x00\x00\x01\x00\x02\xff\xfc\x01\x00\x00\x00\x00B\x14U\x16\x8ew" table := &TableMapEvent{ tableIDSize: 6, @@ -1205,10 +1136,10 @@ func (_ *testDecodeSuite) TestInvalidEvent(c *C) { e2.tables = map[uint64]*TableMapEvent{} e2.tables[0x140] = table err := e2.Decode([]byte(data)) - c.Assert(err, NotNil) + require.Error(t, err) } -func (_ *testDecodeSuite) TestDecodeTime2(c *C) { +func TestDecodeTime2(t *testing.T) { testcases := []struct { data []byte dec uint16 @@ -1233,8 +1164,8 @@ func (_ *testDecodeSuite) TestDecodeTime2(c *C) { } for _, tc := range testcases { value, _, err := decodeTime2(tc.data, tc.dec) - c.Assert(err, IsNil) - c.Assert(value, Equals, tc.expected) + require.NoError(t, err) + require.Equal(t, tc.expected, value) } } @@ -1310,40 +1241,40 @@ var decimalData = []decimalTest{ }, } -func (_ *testDecodeSuite) BenchmarkUseDecimal(c *C) { +func BenchmarkUseDecimal(b *testing.B) { e := &RowsEvent{useDecimal: true} - c.ResetTimer() - for i := 0; i < c.N; i++ { + b.ResetTimer() + for i := 0; i < b.N; i++ { for _, d := range decimalData { _, _, _ = e.decodeValue(d.dumpData, mysql.MYSQL_TYPE_NEWDECIMAL, d.meta, false) } } } -func (_ *testDecodeSuite) BenchmarkNotUseDecimal(c *C) { +func BenchmarkNotUseDecimal(b *testing.B) { e := &RowsEvent{useDecimal: false} - c.ResetTimer() - for i := 0; i < c.N; i++ { + b.ResetTimer() + for i := 0; i < b.N; i++ { for _, d := range decimalData { _, _, _ = e.decodeValue(d.dumpData, mysql.MYSQL_TYPE_NEWDECIMAL, d.meta, false) } } } -func (_ *testDecodeSuite) TestDecimal(c *C) { +func TestDecimal(t *testing.T) { e := &RowsEvent{useDecimal: true} e2 := &RowsEvent{useDecimal: false} for _, d := range decimalData { v, _, err := e.decodeValue(d.dumpData, mysql.MYSQL_TYPE_NEWDECIMAL, d.meta, false) - c.Assert(err, IsNil) + require.NoError(t, err) // no trailing zero dec, err := decimal.NewFromString(d.num) - c.Assert(err, IsNil) - c.Assert(dec.Equal(v.(decimal.Decimal)), IsTrue) + require.NoError(t, err) + require.True(t, dec.Equal(v.(decimal.Decimal))) v, _, err = e2.decodeValue(d.dumpData, mysql.MYSQL_TYPE_NEWDECIMAL, d.meta, false) - c.Assert(err, IsNil) - c.Assert(v.(string), Equals, d.num) + require.NoError(t, err) + require.Equal(t, d.num, v.(string)) } } @@ -1362,10 +1293,10 @@ var intData = [][]byte{ {12, 0, 0, 0}, } -func (_ *testDecodeSuite) BenchmarkInt(c *C) { +func BenchmarkInt(b *testing.B) { e := &RowsEvent{} - c.ResetTimer() - for i := 0; i < c.N; i++ { + b.ResetTimer() + for i := 0; i < b.N; i++ { for _, d := range intData { _, _, _ = e.decodeValue(d, mysql.MYSQL_TYPE_LONG, 0, false) } diff --git a/replication/time_test.go b/replication/time_test.go index 3a06aaf69..84065d7c0 100644 --- a/replication/time_test.go +++ b/replication/time_test.go @@ -1,16 +1,13 @@ package replication import ( + "testing" "time" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -type testTimeSuite struct{} - -var _ = Suite(&testTimeSuite{}) - -func (s *testTimeSuite) TestTime(c *C) { +func TestTime(tt *testing.T) { tbls := []struct { year int month int @@ -29,7 +26,7 @@ func (s *testTimeSuite) TestTime(c *C) { for _, t := range tbls { t1 := fracTime{time.Date(t.year, time.Month(t.month), t.day, t.hour, t.min, t.sec, t.microSec*1000, time.UTC), t.frac, nil} - c.Assert(t1.String(), Equals, t.expected) + require.Equal(tt, t.expected, t1.String()) } zeroTbls := []struct { @@ -46,25 +43,23 @@ func (s *testTimeSuite) TestTime(c *C) { } for _, t := range zeroTbls { - c.Assert(formatZeroTime(t.frac, t.dec), Equals, t.expected) + require.Equal(tt, t.expected, formatZeroTime(t.frac, t.dec)) } } -func (s *testTimeSuite) TestTimeStringLocation(c *C) { +func TestTimeStringLocation(tt *testing.T) { t := fracTime{ time.Date(2018, time.Month(7), 30, 10, 0, 0, 0, time.FixedZone("EST", -5*3600)), 0, nil, } - c.Assert(t.String(), Equals, "2018-07-30 10:00:00") + require.Equal(tt, "2018-07-30 10:00:00", t.String()) t = fracTime{ time.Date(2018, time.Month(7), 30, 10, 0, 0, 0, time.FixedZone("EST", -5*3600)), 0, time.UTC, } - c.Assert(t.String(), Equals, "2018-07-30 15:00:00") + require.Equal(tt, "2018-07-30 15:00:00", t.String()) } - -var _ = Suite(&testTimeSuite{}) diff --git a/schema/schema_test.go b/schema/schema_test.go index 5d86bffb4..46c095076 100644 --- a/schema/schema_test.go +++ b/schema/schema_test.go @@ -6,39 +6,38 @@ import ( "fmt" "testing" - . "github.com/pingcap/check" - "github.com/go-mysql-org/go-mysql/client" _ "github.com/go-mysql-org/go-mysql/driver" "github.com/go-mysql-org/go-mysql/test_util" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" ) var schema = flag.String("schema", "test", "MySQL Database") var pwd = flag.String("pwd", "", "MySQL password") -func Test(t *testing.T) { - TestingT(t) -} - type schemaTestSuite struct { + suite.Suite conn *client.Conn sqlDB *sql.DB } -var _ = Suite(&schemaTestSuite{}) +func TestSchemaSuite(t *testing.T) { + suite.Run(t, new(schemaTestSuite)) +} -func (s *schemaTestSuite) SetUpSuite(c *C) { +func (s *schemaTestSuite) SetupSuite() { addr := fmt.Sprintf("%s:%s", *test_util.MysqlHost, *test_util.MysqlPort) var err error s.conn, err = client.Connect(addr, "root", *pwd, *schema) - c.Assert(err, IsNil) + require.NoError(s.T(), err) s.sqlDB, err = sql.Open("mysql", fmt.Sprintf("root:%s@%s", *pwd, addr)) - c.Assert(err, IsNil) + require.NoError(s.T(), err) } -func (s *schemaTestSuite) TearDownSuite(c *C) { +func (s *schemaTestSuite) TearDownSuite() { if s.conn != nil { s.conn.Close() } @@ -48,9 +47,9 @@ func (s *schemaTestSuite) TearDownSuite(c *C) { } } -func (s *schemaTestSuite) TestSchema(c *C) { +func (s *schemaTestSuite) TestSchema() { _, err := s.conn.Execute(`DROP TABLE IF EXISTS schema_test`) - c.Assert(err, IsNil) + require.NoError(s.T(), err) str := ` CREATE TABLE IF NOT EXISTS schema_test ( @@ -76,62 +75,62 @@ func (s *schemaTestSuite) TestSchema(c *C) { ` _, err = s.conn.Execute(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) ta, err := NewTable(s.conn, *schema, "schema_test") - c.Assert(err, IsNil) - - c.Assert(ta.Columns, HasLen, 15) - c.Assert(ta.Indexes, HasLen, 3) - c.Assert(ta.PKColumns, DeepEquals, []int{2, 0}) - c.Assert(ta.IsPrimaryKey(0), IsTrue) - c.Assert(ta.IsPrimaryKey(1), IsFalse) - c.Assert(ta.IsPrimaryKey(2), IsTrue) - c.Assert(ta.IsPrimaryKey(3), IsFalse) - c.Assert(ta.GetPKColumn(0), Equals, &ta.Columns[2]) - c.Assert(ta.GetPKColumn(1), Equals, &ta.Columns[0]) - c.Assert(ta.GetPKColumn(2), IsNil) - c.Assert(ta.GetPKColumn(3), IsNil) - c.Assert(ta.Indexes[0].Columns, HasLen, 2) - c.Assert(ta.Indexes[0].Name, Equals, "PRIMARY") - c.Assert(ta.Indexes[2].Name, Equals, "name_idx") - c.Assert(ta.Columns[3].Type, Equals, TYPE_STRING) - c.Assert(ta.Columns[3].MaxSize, Equals, uint(256)) - c.Assert(ta.Columns[3].FixedSize, Equals, uint(0)) - c.Assert(ta.Columns[4].EnumValues, DeepEquals, []string{"appointing", "serving", "abnormal", "stop", "noaftermarket", "finish", "financial_audit"}) - c.Assert(ta.Columns[5].SetValues, DeepEquals, []string{"a", "b", "c"}) - c.Assert(ta.Columns[7].Type, Equals, TYPE_DECIMAL) - c.Assert(ta.Columns[0].IsUnsigned, IsFalse) - c.Assert(ta.Columns[8].IsUnsigned, IsTrue) - c.Assert(ta.Columns[9].IsUnsigned, IsTrue) - c.Assert(ta.Columns[10].Collation, Matches, "^ucs2.*") - c.Assert(ta.Columns[10].MaxSize, Equals, uint(256)) - c.Assert(ta.Columns[10].FixedSize, Equals, uint(0)) - c.Assert(ta.Columns[11].Collation, Matches, "^utf8.*") - c.Assert(ta.Columns[12].Type, Equals, TYPE_STRING) - c.Assert(ta.Columns[12].MaxSize, Equals, uint(10)) - c.Assert(ta.Columns[12].FixedSize, Equals, uint(10)) - c.Assert(ta.Columns[13].Type, Equals, TYPE_BINARY) - c.Assert(ta.Columns[13].MaxSize, Equals, uint(11)) - c.Assert(ta.Columns[13].FixedSize, Equals, uint(11)) - c.Assert(ta.Columns[14].Type, Equals, TYPE_BINARY) - c.Assert(ta.Columns[14].MaxSize, Equals, uint(12)) - c.Assert(ta.Columns[14].FixedSize, Equals, uint(0)) + require.NoError(s.T(), err) + + require.Len(s.T(), ta.Columns, 15) + require.Len(s.T(), ta.Indexes, 3) + require.Equal(s.T(), []int{2, 0}, ta.PKColumns) + require.True(s.T(), ta.IsPrimaryKey(0)) + require.False(s.T(), ta.IsPrimaryKey(1)) + require.True(s.T(), ta.IsPrimaryKey(2)) + require.False(s.T(), ta.IsPrimaryKey(3)) + require.Equal(s.T(), &ta.Columns[2], ta.GetPKColumn(0)) + require.Equal(s.T(), &ta.Columns[0], ta.GetPKColumn(1)) + require.Nil(s.T(), ta.GetPKColumn(2)) + require.Nil(s.T(), ta.GetPKColumn(3)) + require.Len(s.T(), ta.Indexes[0].Columns, 2) + require.Equal(s.T(), "PRIMARY", ta.Indexes[0].Name) + require.Equal(s.T(), "name_idx", ta.Indexes[2].Name) + require.Equal(s.T(), TYPE_STRING, ta.Columns[3].Type) + require.Equal(s.T(), uint(256), ta.Columns[3].MaxSize) + require.Equal(s.T(), uint(0), ta.Columns[3].FixedSize) + require.Equal(s.T(), []string{"appointing", "serving", "abnormal", "stop", "noaftermarket", "finish", "financial_audit"}, ta.Columns[4].EnumValues) + require.Equal(s.T(), []string{"a", "b", "c"}, ta.Columns[5].SetValues) + require.Equal(s.T(), TYPE_DECIMAL, ta.Columns[7].Type) + require.False(s.T(), ta.Columns[0].IsUnsigned) + require.True(s.T(), ta.Columns[8].IsUnsigned) + require.True(s.T(), ta.Columns[9].IsUnsigned) + require.Contains(s.T(), ta.Columns[10].Collation, "ucs2") + require.Equal(s.T(), uint(256), ta.Columns[10].MaxSize) + require.Equal(s.T(), uint(0), ta.Columns[10].FixedSize) + require.Contains(s.T(), ta.Columns[11].Collation, "utf8") + require.Equal(s.T(), TYPE_STRING, ta.Columns[12].Type) + require.Equal(s.T(), uint(10), ta.Columns[12].MaxSize) + require.Equal(s.T(), uint(10), ta.Columns[12].FixedSize) + require.Equal(s.T(), TYPE_BINARY, ta.Columns[13].Type) + require.Equal(s.T(), uint(11), ta.Columns[13].MaxSize) + require.Equal(s.T(), uint(11), ta.Columns[13].FixedSize) + require.Equal(s.T(), TYPE_BINARY, ta.Columns[14].Type) + require.Equal(s.T(), uint(12), ta.Columns[14].MaxSize) + require.Equal(s.T(), uint(0), ta.Columns[14].FixedSize) taSqlDb, err := NewTableFromSqlDB(s.sqlDB, *schema, "schema_test") - c.Assert(err, IsNil) + require.NoError(s.T(), err) - c.Assert(taSqlDb, DeepEquals, ta) + require.Equal(s.T(), ta, taSqlDb) } -func (s *schemaTestSuite) TestQuoteSchema(c *C) { +func (s *schemaTestSuite) TestQuoteSchema() { str := "CREATE TABLE IF NOT EXISTS `a-b_test` (`a.b` INT) ENGINE = INNODB" _, err := s.conn.Execute(str) - c.Assert(err, IsNil) + require.NoError(s.T(), err) ta, err := NewTable(s.conn, *schema, "a-b_test") - c.Assert(err, IsNil) + require.NoError(s.T(), err) - c.Assert(ta.Columns[0].Name, Equals, "a.b") + require.Equal(s.T(), "a.b", ta.Columns[0].Name) } diff --git a/server/caching_sha2_cache_test.go b/server/caching_sha2_cache_test.go index 85b6fb67c..247e1870f 100644 --- a/server/caching_sha2_cache_test.go +++ b/server/caching_sha2_cache_test.go @@ -10,9 +10,10 @@ import ( "time" _ "github.com/go-sql-driver/mysql" - . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/siddontang/go-log/log" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "github.com/go-mysql-org/go-mysql/mysql" "github.com/go-mysql-org/go-mysql/test_util" @@ -32,13 +33,11 @@ func TestCachingSha2Cache(t *testing.T) { cacheServer := NewServer("8.0.12", mysql.DEFAULT_COLLATION_ID, mysql.AUTH_CACHING_SHA2_PASSWORD, test_keys.PubPem, tlsConf) // no TLS - Suite(&cacheTestSuite{ + suite.Run(t, &cacheTestSuite{ server: cacheServer, credProvider: remoteProvider, tlsPara: "false", }) - - TestingT(t) } func TestCachingSha2CacheTLS(t *testing.T) { @@ -49,13 +48,11 @@ func TestCachingSha2CacheTLS(t *testing.T) { cacheServer := NewServer("8.0.12", mysql.DEFAULT_COLLATION_ID, mysql.AUTH_CACHING_SHA2_PASSWORD, test_keys.PubPem, tlsConf) // TLS - Suite(&cacheTestSuite{ + suite.Run(t, &cacheTestSuite{ server: cacheServer, credProvider: remoteProvider, tlsPara: "skip-verify", }) - - TestingT(t) } type RemoteThrottleProvider struct { @@ -69,6 +66,7 @@ func (m *RemoteThrottleProvider) GetCredential(username string) (password string } type cacheTestSuite struct { + suite.Suite server *Server serverAddr string credProvider CredentialProvider @@ -79,40 +77,40 @@ type cacheTestSuite struct { l net.Listener } -func (s *cacheTestSuite) SetUpSuite(c *C) { +func (s *cacheTestSuite) SetupSuite() { s.serverAddr = fmt.Sprintf("%s:%s", *test_util.MysqlFakeHost, *test_util.MysqlFakePort) var err error s.l, err = net.Listen("tcp", s.serverAddr) - c.Assert(err, IsNil) + require.NoError(s.T(), err) - go s.onAccept(c) + go s.onAccept() time.Sleep(30 * time.Millisecond) } -func (s *cacheTestSuite) TearDownSuite(c *C) { +func (s *cacheTestSuite) TearDownSuite() { if s.l != nil { s.l.Close() } } -func (s *cacheTestSuite) onAccept(c *C) { +func (s *cacheTestSuite) onAccept() { for { conn, err := s.l.Accept() if err != nil { return } - go s.onConn(conn, c) + go s.onConn(conn) } } -func (s *cacheTestSuite) onConn(conn net.Conn, c *C) { +func (s *cacheTestSuite) onConn(conn net.Conn) { //co, err := NewConn(conn, *testUser, *testPassword, &testHandler{s}) co, err := NewCustomizedConn(conn, s.server, s.credProvider, &testCacheHandler{s}) - c.Assert(err, IsNil) + require.NoError(s.T(), err) for { err = co.HandleCommand() if err != nil { @@ -121,30 +119,30 @@ func (s *cacheTestSuite) onConn(conn net.Conn, c *C) { } } -func (s *cacheTestSuite) runSelect(c *C) { +func (s *cacheTestSuite) runSelect() { var a int64 var b string err := s.db.QueryRow("SELECT a, b FROM tbl WHERE id=1").Scan(&a, &b) - c.Assert(err, IsNil) - c.Assert(a, Equals, int64(1)) - c.Assert(b, Equals, "hello world") + require.NoError(s.T(), err) + require.Equal(s.T(), int64(1), a) + require.Equal(s.T(), "hello world", b) } -func (s *cacheTestSuite) TestCache(c *C) { +func (s *cacheTestSuite) TestCache() { // first connection t1 := time.Now() var err error s.db, err = sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?tls=%s", *testUser, *testPassword, s.serverAddr, *testDB, s.tlsPara)) - c.Assert(err, IsNil) + require.NoError(s.T(), err) s.db.SetMaxIdleConns(4) - s.runSelect(c) + s.runSelect() t2 := time.Now() d1 := int(t2.Sub(t1).Nanoseconds() / 1e6) //log.Debugf("first connection took %d milliseconds", d1) - c.Assert(d1, GreaterEqual, delay) + require.GreaterOrEqual(s.T(), d1, delay) if s.db != nil { s.db.Close() @@ -153,15 +151,15 @@ func (s *cacheTestSuite) TestCache(c *C) { // second connection t3 := time.Now() s.db, err = sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?tls=%s", *testUser, *testPassword, s.serverAddr, *testDB, s.tlsPara)) - c.Assert(err, IsNil) + require.NoError(s.T(), err) s.db.SetMaxIdleConns(4) - s.runSelect(c) + s.runSelect() t4 := time.Now() d2 := int(t4.Sub(t3).Nanoseconds() / 1e6) //log.Debugf("second connection took %d milliseconds", d2) - c.Assert(d2, Less, delay) + require.Less(s.T(), d2, delay) if s.db != nil { s.db.Close() } diff --git a/server/conn_test.go b/server/conn_test.go index da5926582..d14882136 100644 --- a/server/conn_test.go +++ b/server/conn_test.go @@ -1,16 +1,13 @@ package server import ( + "testing" + "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -type connTestSuite struct { -} - -var _ = check.Suite(&connTestSuite{}) - -func (t *connTestSuite) TestStatus(c *check.C) { +func TestStatus(t *testing.T) { conn := Conn{} flags := []uint16{ @@ -29,35 +26,35 @@ func (t *connTestSuite) TestStatus(c *check.C) { } for _, f := range flags { - c.Assert(conn.HasStatus(f), check.IsFalse) + require.False(t, conn.HasStatus(f)) conn.SetStatus(f) - c.Assert(conn.HasStatus(f), check.IsTrue) + require.True(t, conn.HasStatus(f)) conn.UnsetStatus(f) - c.Assert(conn.HasStatus(f), check.IsFalse) + require.False(t, conn.HasStatus(f)) } // check special flag setters // IsAutoCommit - c.Assert(conn.IsAutoCommit(), check.IsFalse) + require.False(t, conn.IsAutoCommit()) conn.SetStatus(mysql.SERVER_STATUS_AUTOCOMMIT) - c.Assert(conn.IsAutoCommit(), check.IsTrue) + require.True(t, conn.IsAutoCommit()) conn.UnsetStatus(mysql.SERVER_STATUS_AUTOCOMMIT) // IsInTransaction - c.Assert(conn.IsInTransaction(), check.IsFalse) + require.False(t, conn.IsInTransaction()) conn.SetStatus(mysql.SERVER_STATUS_IN_TRANS) - c.Assert(conn.IsInTransaction(), check.IsTrue) + require.True(t, conn.IsInTransaction()) conn.UnsetStatus(mysql.SERVER_STATUS_IN_TRANS) // SetInTransaction & ClearInTransaction - c.Assert(conn.HasStatus(mysql.SERVER_STATUS_IN_TRANS), check.IsFalse) + require.False(t, conn.HasStatus(mysql.SERVER_STATUS_IN_TRANS)) conn.SetInTransaction() - c.Assert(conn.HasStatus(mysql.SERVER_STATUS_IN_TRANS), check.IsTrue) + require.True(t, conn.HasStatus(mysql.SERVER_STATUS_IN_TRANS)) conn.ClearInTransaction() - c.Assert(conn.HasStatus(mysql.SERVER_STATUS_IN_TRANS), check.IsFalse) + require.False(t, conn.HasStatus(mysql.SERVER_STATUS_IN_TRANS)) } -func (t *connTestSuite) TestCapability(c *check.C) { +func TestCapability(t *testing.T) { conn := Conn{} caps := []uint32{ @@ -86,11 +83,11 @@ func (t *connTestSuite) TestCapability(c *check.C) { } for _, capI := range caps { - c.Assert(conn.HasCapability(capI), check.IsFalse) + require.False(t, conn.HasCapability(capI)) conn.SetCapability(capI) - c.Assert(conn.HasCapability(capI), check.IsTrue) - c.Assert(conn.Capability()&capI > 0, check.IsTrue) + require.True(t, conn.HasCapability(capI)) + require.True(t, conn.Capability()&capI > 0) conn.UnsetCapability(capI) - c.Assert(conn.HasCapability(capI), check.IsFalse) + require.False(t, conn.HasCapability(capI)) } } diff --git a/server/handshake_resp_test.go b/server/handshake_resp_test.go index dc0df4d8d..c75b9d180 100644 --- a/server/handshake_resp_test.go +++ b/server/handshake_resp_test.go @@ -7,6 +7,7 @@ import ( "github.com/go-mysql-org/go-mysql/mocks" "github.com/go-mysql-org/go-mysql/mysql" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" ) func TestReadAuthData(t *testing.T) { @@ -18,18 +19,12 @@ func TestReadAuthData(t *testing.T) { // test out of range index returns 'bad handshake' error _, _, _, err := c.readAuthData(data, len(data)) - if err == nil || err.Error() != "ERROR 1043 (08S01): Bad handshake" { - t.Fatal("expected error, got nil") - } + require.ErrorContains(t, err, "ERROR 1043 (08S01): Bad handshake") // test good index position reads auth data _, _, readBytes, err := c.readAuthData(data, len(data)-1) - if err != nil { - t.Fatalf("expected nil error, got %v", err) - } - if readBytes != len(data)-1 { - t.Fatalf("expected %d read bytes, got %d", len(data)-1, readBytes) - } + require.NoError(t, err) + require.Equal(t, len(data)-1, readBytes) } func TestDecodeFirstPart(t *testing.T) { diff --git a/server/resp_test.go b/server/resp_test.go index 4a290e6e5..3608c60c3 100644 --- a/server/resp_test.go +++ b/server/resp_test.go @@ -2,18 +2,15 @@ package server import ( "errors" + "testing" "github.com/go-mysql-org/go-mysql/mysql" "github.com/go-mysql-org/go-mysql/packet" mockconn "github.com/go-mysql-org/go-mysql/test_util/conn" - "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -type respConnTestSuite struct{} - -var _ = check.Suite(&respConnTestSuite{}) - -func (t *respConnTestSuite) TestConnWriteOK(c *check.C) { +func TestConnWriteOK(t *testing.T) { clientConn := &mockconn.MockConn{} conn := &Conn{Conn: packet.NewConn(clientConn)} @@ -24,92 +21,95 @@ func (t *respConnTestSuite) TestConnWriteOK(c *check.C) { // write ok with insertid and affectedrows set err := conn.writeOK(result) - c.Assert(err, check.IsNil) - c.Assert(clientConn.WriteBuffered, check.BytesEquals, []byte{3, 0, 0, 0, mysql.OK_HEADER, 1, 2}) + require.NoError(t, err) + expected := []byte{3, 0, 0, 0, mysql.OK_HEADER, 1, 2} + require.Equal(t, expected, clientConn.WriteBuffered) // set capability for CLIENT_PROTOCOL_41 conn.SetCapability(mysql.CLIENT_PROTOCOL_41) conn.SetStatus(mysql.SERVER_QUERY_WAS_SLOW) err = conn.writeOK(result) - c.Assert(err, check.IsNil) - c.Assert(clientConn.WriteBuffered, check.BytesEquals, []byte{7, 0, 0, 1, mysql.OK_HEADER, 1, 2, 0, 8, 0, 0}) + require.NoError(t, err) + expected = []byte{7, 0, 0, 1, mysql.OK_HEADER, 1, 2, 0, 8, 0, 0} + require.Equal(t, expected, clientConn.WriteBuffered) } -func (t *respConnTestSuite) TestConnWriteEOF(c *check.C) { +func TestConnWriteEOF(t *testing.T) { clientConn := &mockconn.MockConn{} conn := &Conn{Conn: packet.NewConn(clientConn)} // write regular EOF err := conn.writeEOF() - c.Assert(err, check.IsNil) - c.Assert(clientConn.WriteBuffered, check.BytesEquals, []byte{1, 0, 0, 0, mysql.EOF_HEADER}) + require.NoError(t, err) + expected := []byte{1, 0, 0, 0, mysql.EOF_HEADER} + require.Equal(t, expected, clientConn.WriteBuffered) // set capability for CLIENT_PROTOCOL_41 conn.SetCapability(mysql.CLIENT_PROTOCOL_41) conn.SetStatus(mysql.SERVER_MORE_RESULTS_EXISTS) err = conn.writeEOF() - c.Assert(err, check.IsNil) - c.Assert(clientConn.WriteBuffered, check.BytesEquals, []byte{5, 0, 0, 1, mysql.EOF_HEADER, - 0, 0, 8, 0}) + require.NoError(t, err) + expected = []byte{5, 0, 0, 1, mysql.EOF_HEADER, 0, 0, 8, 0} + require.Equal(t, expected, clientConn.WriteBuffered) } -func (t *respConnTestSuite) TestConnWriteError(c *check.C) { +func TestConnWriteError(t *testing.T) { clientConn := &mockconn.MockConn{} conn := &Conn{Conn: packet.NewConn(clientConn)} merr := mysql.NewDefaultError(mysql.ER_YES) // nice and short error message // write regular Error err := conn.writeError(merr) - c.Assert(err, check.IsNil) - c.Assert(clientConn.WriteBuffered, check.BytesEquals, []byte{6, 0, 0, 0, mysql.ERR_HEADER, - 235, 3, 89, 69, 83}) + require.NoError(t, err) + expected := []byte{6, 0, 0, 0, mysql.ERR_HEADER, 235, 3, 89, 69, 83} + require.Equal(t, expected, clientConn.WriteBuffered) // set capability for CLIENT_PROTOCOL_41 conn.SetCapability(mysql.CLIENT_PROTOCOL_41) err = conn.writeError(merr) - c.Assert(err, check.IsNil) - c.Assert(clientConn.WriteBuffered, check.BytesEquals, []byte{12, 0, 0, 1, mysql.ERR_HEADER, - 235, 3, 35, 72, 89, 48, 48, 48, 89, 69, 83}) + require.NoError(t, err) + expected = []byte{12, 0, 0, 1, mysql.ERR_HEADER, 235, 3, 35, 72, 89, 48, 48, 48, 89, 69, 83} + require.Equal(t, expected, clientConn.WriteBuffered) // unknown error err = conn.writeError(errors.New("test")) - c.Assert(err, check.IsNil) - c.Assert(clientConn.WriteBuffered, check.BytesEquals, []byte{13, 0, 0, 2, mysql.ERR_HEADER, - 81, 4, 35, 72, 89, 48, 48, 48, 116, 101, 115, 116}) + require.NoError(t, err) + expected = []byte{13, 0, 0, 2, mysql.ERR_HEADER, 81, 4, 35, 72, 89, 48, 48, 48, 116, 101, 115, 116} + require.Equal(t, expected, clientConn.WriteBuffered) } -func (t *respConnTestSuite) TestConnWriteAuthSwitchRequest(c *check.C) { +func TestConnWriteAuthSwitchRequest(t *testing.T) { clientConn := &mockconn.MockConn{} conn := &Conn{Conn: packet.NewConn(clientConn)} err := conn.writeAuthSwitchRequest("test") - c.Assert(err, check.IsNil) + require.NoError(t, err) // first 10 bytes are static, then there is a part random, ending with a \0 - c.Assert(clientConn.WriteBuffered[:10], check.BytesEquals, []byte{27, 0, 0, 0, mysql.EOF_HEADER, - 116, 101, 115, 116, 0}) - c.Assert(clientConn.WriteBuffered[len(clientConn.WriteBuffered)-1:], check.BytesEquals, []byte{0}) + expected := []byte{27, 0, 0, 0, mysql.EOF_HEADER, 116, 101, 115, 116, 0} + require.Equal(t, expected, clientConn.WriteBuffered[:10]) + require.Equal(t, byte(0), clientConn.WriteBuffered[len(clientConn.WriteBuffered)-1]) } -func (t *respConnTestSuite) TestConnReadAuthSwitchRequestResponse(c *check.C) { +func TestConnReadAuthSwitchRequestResponse(t *testing.T) { clientConn := &mockconn.MockConn{} conn := &Conn{Conn: packet.NewConn(clientConn)} // prepare response for \NUL clientConn.SetResponse([][]byte{{1, 0, 0, 0, 0}}) data, err := conn.readAuthSwitchRequestResponse() - c.Assert(err, check.IsNil) - c.Assert(data, check.BytesEquals, []byte{}) + require.NoError(t, err) + require.Equal(t, []byte{}, data) // prepare response for some auth switch data clientConn.SetResponse([][]byte{{4, 0, 0, 0, 1, 2, 3, 4}}) conn = &Conn{Conn: packet.NewConn(clientConn)} data, err = conn.readAuthSwitchRequestResponse() - c.Assert(err, check.IsNil) - c.Assert(data, check.BytesEquals, []byte{1, 2, 3, 4}) + require.NoError(t, err) + require.Equal(t, []byte{1, 2, 3, 4}, data) } -func (t *respConnTestSuite) TestConnWriteAuthMoreDataPubkey(c *check.C) { +func TestConnWriteAuthMoreDataPubkey(t *testing.T) { clientConn := &mockconn.MockConn{} conn := &Conn{ Conn: packet.NewConn(clientConn), @@ -119,32 +119,32 @@ func (t *respConnTestSuite) TestConnWriteAuthMoreDataPubkey(c *check.C) { } err := conn.writeAuthMoreDataPubkey() - c.Assert(err, check.IsNil) - c.Assert(clientConn.WriteBuffered, check.BytesEquals, []byte{5, 0, 0, 0, mysql.MORE_DATE_HEADER, - 1, 2, 3, 4}) + require.NoError(t, err) + expected := []byte{5, 0, 0, 0, mysql.MORE_DATE_HEADER, 1, 2, 3, 4} + require.Equal(t, expected, clientConn.WriteBuffered) } -func (t *respConnTestSuite) TestConnWriteAuthMoreDataFullAuth(c *check.C) { +func TestConnWriteAuthMoreDataFullAuth(t *testing.T) { clientConn := &mockconn.MockConn{} conn := &Conn{Conn: packet.NewConn(clientConn)} err := conn.writeAuthMoreDataFullAuth() - c.Assert(err, check.IsNil) - c.Assert(clientConn.WriteBuffered, check.BytesEquals, []byte{2, 0, 0, 0, mysql.MORE_DATE_HEADER, - mysql.CACHE_SHA2_FULL_AUTH}) + require.NoError(t, err) + expected := []byte{2, 0, 0, 0, mysql.MORE_DATE_HEADER, mysql.CACHE_SHA2_FULL_AUTH} + require.Equal(t, expected, clientConn.WriteBuffered) } -func (t *respConnTestSuite) TestConnWriteAuthMoreDataFastAuth(c *check.C) { +func TestConnWriteAuthMoreDataFastAuth(t *testing.T) { clientConn := &mockconn.MockConn{} conn := &Conn{Conn: packet.NewConn(clientConn)} err := conn.writeAuthMoreDataFastAuth() - c.Assert(err, check.IsNil) - c.Assert(clientConn.WriteBuffered, check.BytesEquals, []byte{2, 0, 0, 0, mysql.MORE_DATE_HEADER, - mysql.CACHE_SHA2_FAST_AUTH}) + require.NoError(t, err) + expected := []byte{2, 0, 0, 0, mysql.MORE_DATE_HEADER, mysql.CACHE_SHA2_FAST_AUTH} + require.Equal(t, expected, clientConn.WriteBuffered) } -func (t *respConnTestSuite) TestConnWriteResultset(c *check.C) { +func TestConnWriteResultset(t *testing.T) { clientConn := &mockconn.MockConn{MultiWrite: true} conn := &Conn{Conn: packet.NewConn(clientConn)} @@ -152,45 +152,45 @@ func (t *respConnTestSuite) TestConnWriteResultset(c *check.C) { // write minimalistic resultset err := conn.writeResultset(r) - c.Assert(err, check.IsNil) + require.NoError(t, err) // column length 0 - c.Assert(clientConn.WriteBuffered[:5], check.BytesEquals, []byte{1, 0, 0, 0, 0}) + require.Equal(t, []byte{1, 0, 0, 0, 0}, clientConn.WriteBuffered[:5]) // no fields and an EOF - c.Assert(clientConn.WriteBuffered[5:10], check.BytesEquals, []byte{1, 0, 0, 1, mysql.EOF_HEADER}) + require.Equal(t, []byte{1, 0, 0, 1, mysql.EOF_HEADER}, clientConn.WriteBuffered[5:10]) // no rows and another EOF - c.Assert(clientConn.WriteBuffered[10:], check.BytesEquals, []byte{1, 0, 0, 2, mysql.EOF_HEADER}) + require.Equal(t, []byte{1, 0, 0, 2, mysql.EOF_HEADER}, clientConn.WriteBuffered[10:]) // reset write buffer and fill up the resultset with (little) data clientConn.WriteBuffered = []byte{} r, err = mysql.BuildSimpleTextResultset([]string{"a"}, [][]interface{}{{"b"}}) - c.Assert(err, check.IsNil) + require.NoError(t, err) err = conn.writeResultset(r) - c.Assert(err, check.IsNil) + require.NoError(t, err) // column length 1 - c.Assert(clientConn.WriteBuffered[:5], check.BytesEquals, []byte{1, 0, 0, 3, 1}) + require.Equal(t, []byte{1, 0, 0, 3, 1}, clientConn.WriteBuffered[:5]) // fields and EOF - c.Assert(clientConn.WriteBuffered[5:32], check.BytesEquals, []byte{23, 0, 0, 4, 3, 100, 101, 102, 0, 0, 0, 1, 'a', 0, 12, 33, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0}) - c.Assert(clientConn.WriteBuffered[32:37], check.BytesEquals, []byte{1, 0, 0, 5, mysql.EOF_HEADER}) + require.Equal(t, []byte{23, 0, 0, 4, 3, 100, 101, 102, 0, 0, 0, 1, 'a', 0, 12, 33, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0}, clientConn.WriteBuffered[5:32]) + require.Equal(t, []byte{1, 0, 0, 5, mysql.EOF_HEADER}, clientConn.WriteBuffered[32:37]) // rowdata and EOF - c.Assert(clientConn.WriteBuffered[37:43], check.BytesEquals, []byte{2, 0, 0, 6, 1, 'b'}) - c.Assert(clientConn.WriteBuffered[43:], check.BytesEquals, []byte{1, 0, 0, 7, mysql.EOF_HEADER}) + require.Equal(t, []byte{2, 0, 0, 6, 1, 'b'}, clientConn.WriteBuffered[37:43]) + require.Equal(t, []byte{1, 0, 0, 7, mysql.EOF_HEADER}, clientConn.WriteBuffered[43:]) } -func (t *respConnTestSuite) TestConnWriteFieldList(c *check.C) { +func TestConnWriteFieldList(t *testing.T) { clientConn := &mockconn.MockConn{MultiWrite: true} conn := &Conn{Conn: packet.NewConn(clientConn)} r, err := mysql.BuildSimpleTextResultset([]string{"c"}, [][]interface{}{{"d"}}) - c.Assert(err, check.IsNil) + require.NoError(t, err) err = conn.writeFieldList(r.Fields, nil) - c.Assert(err, check.IsNil) + require.NoError(t, err) // column length 1 - c.Assert(clientConn.WriteBuffered[:27], check.BytesEquals, []byte{23, 0, 0, 0, 3, 100, 101, 102, 0, 0, 0, 1, 'c', 0, 12, 33, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0}) - c.Assert(clientConn.WriteBuffered[27:], check.BytesEquals, []byte{1, 0, 0, 1, mysql.EOF_HEADER}) + require.Equal(t, []byte{23, 0, 0, 0, 3, 100, 101, 102, 0, 0, 0, 1, 'c', 0, 12, 33, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0}, clientConn.WriteBuffered[:27]) + require.Equal(t, []byte{1, 0, 0, 1, mysql.EOF_HEADER}, clientConn.WriteBuffered[27:]) } -func (t *respConnTestSuite) TestConnWriteFieldValues(c *check.C) { +func TestConnWriteFieldValues(t *testing.T) { clientConn := &mockconn.MockConn{MultiWrite: true} conn := &Conn{Conn: packet.NewConn(clientConn)} @@ -199,33 +199,33 @@ func (t *respConnTestSuite) TestConnWriteFieldValues(c *check.C) { {nil}, }) - c.Assert(err, check.IsNil) + require.NoError(t, err) err = conn.writeFieldList(r.Fields, nil) - c.Assert(err, check.IsNil) + require.NoError(t, err) // fields and EOF - c.Assert(clientConn.WriteBuffered[:27], check.BytesEquals, []byte{23, 0, 0, 0, 3, 100, 101, 102, 0, 0, 0, 1, 'c', 0, 12, 33, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0}) - c.Assert(clientConn.WriteBuffered[27:32], check.BytesEquals, []byte{1, 0, 0, 1, mysql.EOF_HEADER}) + require.Equal(t, []byte{23, 0, 0, 0, 3, 100, 101, 102, 0, 0, 0, 1, 'c', 0, 12, 33, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0}, clientConn.WriteBuffered[:27]) + require.Equal(t, []byte{1, 0, 0, 1, mysql.EOF_HEADER}, clientConn.WriteBuffered[27:32]) r.Values = make([][]mysql.FieldValue, len(r.RowDatas)) for i := range r.Values { r.Values[i], err = r.RowDatas[i].Parse(r.Fields, false, r.Values[i]) - c.Assert(err, check.IsNil) + require.NoError(t, err) err = conn.writeFieldValues(r.Values[i]) - c.Assert(err, check.IsNil) + require.NoError(t, err) } err = conn.writeEOF() - c.Assert(err, check.IsNil) + require.NoError(t, err) // first row - c.Assert(clientConn.WriteBuffered[32:38], check.BytesEquals, []byte{2, 0, 0, 2, 1, 'd'}) + require.Equal(t, []byte{2, 0, 0, 2, 1, 'd'}, clientConn.WriteBuffered[32:38]) // second row with NULL value - c.Assert(clientConn.WriteBuffered[38:43], check.BytesEquals, []byte{1, 0, 0, 3, 251}) + require.Equal(t, []byte{1, 0, 0, 3, 251}, clientConn.WriteBuffered[38:43]) // EOF - c.Assert(clientConn.WriteBuffered[43:], check.BytesEquals, []byte{1, 0, 0, 4, mysql.EOF_HEADER}) + require.Equal(t, []byte{1, 0, 0, 4, mysql.EOF_HEADER}, clientConn.WriteBuffered[43:]) } diff --git a/server/server_test.go b/server/server_test.go index e1ce748b1..1756f4c55 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -11,9 +11,10 @@ import ( "time" _ "github.com/go-sql-driver/mysql" - . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/siddontang/go-log/log" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "github.com/go-mysql-org/go-mysql/mysql" "github.com/go-mysql-org/go-mysql/test_util" @@ -66,7 +67,7 @@ func Test(t *testing.T) { servers := prepareServerConf() //no TLS for _, svr := range servers { - Suite(&serverTestSuite{ + suite.Run(t, &serverTestSuite{ server: svr, credProvider: inMemProvider, tlsPara: "false", @@ -76,18 +77,17 @@ func Test(t *testing.T) { // TLS if server supports for _, svr := range servers { if svr.tlsConfig != nil { - Suite(&serverTestSuite{ + suite.Run(t, &serverTestSuite{ server: svr, credProvider: inMemProvider, tlsPara: "skip-verify", }) } } - - TestingT(t) } type serverTestSuite struct { + suite.Suite server *Server credProvider CredentialProvider @@ -98,25 +98,25 @@ type serverTestSuite struct { l net.Listener } -func (s *serverTestSuite) SetUpSuite(c *C) { +func (s *serverTestSuite) SetupSuite() { addr := fmt.Sprintf("%s:%s", *test_util.MysqlFakeHost, *test_util.MysqlFakePort) var err error s.l, err = net.Listen("tcp", addr) - c.Assert(err, IsNil) + require.NoError(s.T(), err) - go s.onAccept(c) + go s.onAccept() time.Sleep(20 * time.Millisecond) s.db, err = sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?tls=%s", *testUser, *testPassword, addr, *testDB, s.tlsPara)) - c.Assert(err, IsNil) + require.NoError(s.T(), err) s.db.SetMaxIdleConns(4) } -func (s *serverTestSuite) TearDownSuite(c *C) { +func (s *serverTestSuite) TearDownSuite() { if s.db != nil { s.db.Close() } @@ -126,21 +126,21 @@ func (s *serverTestSuite) TearDownSuite(c *C) { } } -func (s *serverTestSuite) onAccept(c *C) { +func (s *serverTestSuite) onAccept() { for { conn, err := s.l.Accept() if err != nil { return } - go s.onConn(conn, c) + go s.onConn(conn) } } -func (s *serverTestSuite) onConn(conn net.Conn, c *C) { +func (s *serverTestSuite) onConn(conn net.Conn) { //co, err := NewConn(conn, *testUser, *testPassword, &testHandler{s}) co, err := NewCustomizedConn(conn, s.server, s.credProvider, &testHandler{s}) - c.Assert(err, IsNil) + require.NoError(s.T(), err) // set SSL if defined for { err = co.HandleCommand() @@ -150,68 +150,68 @@ func (s *serverTestSuite) onConn(conn net.Conn, c *C) { } } -func (s *serverTestSuite) TestSelect(c *C) { +func (s *serverTestSuite) TestSelect() { var a int64 var b string err := s.db.QueryRow("SELECT a, b FROM tbl WHERE id=1").Scan(&a, &b) - c.Assert(err, IsNil) - c.Assert(a, Equals, int64(1)) - c.Assert(b, Equals, "hello world") + require.NoError(s.T(), err) + require.Equal(s.T(), int64(1), a) + require.Equal(s.T(), "hello world", b) } -func (s *serverTestSuite) TestExec(c *C) { +func (s *serverTestSuite) TestExec() { r, err := s.db.Exec("INSERT INTO tbl (a, b) values (1, \"hello world\")") - c.Assert(err, IsNil) + require.NoError(s.T(), err) i, _ := r.LastInsertId() - c.Assert(i, Equals, int64(1)) + require.Equal(s.T(), int64(1), i) r, err = s.db.Exec("REPLACE INTO tbl (a, b) values (1, \"hello world\")") - c.Assert(err, IsNil) + require.NoError(s.T(), err) i, _ = r.RowsAffected() - c.Assert(i, Equals, int64(1)) + require.Equal(s.T(), int64(1), i) r, err = s.db.Exec("UPDATE tbl SET b = \"abc\" where a = 1") - c.Assert(err, IsNil) + require.NoError(s.T(), err) i, _ = r.RowsAffected() - c.Assert(i, Equals, int64(1)) + require.Equal(s.T(), int64(1), i) r, err = s.db.Exec("DELETE FROM tbl where a = 1") - c.Assert(err, IsNil) + require.NoError(s.T(), err) i, _ = r.RowsAffected() - c.Assert(i, Equals, int64(1)) + require.Equal(s.T(), int64(1), i) } -func (s *serverTestSuite) TestStmtSelect(c *C) { +func (s *serverTestSuite) TestStmtSelect() { var a int64 var b string err := s.db.QueryRow("SELECT a, b FROM tbl WHERE id=?", 1).Scan(&a, &b) - c.Assert(err, IsNil) - c.Assert(a, Equals, int64(1)) - c.Assert(b, Equals, "hello world") + require.NoError(s.T(), err) + require.Equal(s.T(), int64(1), a) + require.Equal(s.T(), "hello world", b) } -func (s *serverTestSuite) TestStmtExec(c *C) { +func (s *serverTestSuite) TestStmtExec() { r, err := s.db.Exec("INSERT INTO tbl (a, b) values (?, ?)", 1, "hello world") - c.Assert(err, IsNil) + require.NoError(s.T(), err) i, _ := r.LastInsertId() - c.Assert(i, Equals, int64(1)) + require.Equal(s.T(), int64(1), i) r, err = s.db.Exec("REPLACE INTO tbl (a, b) values (?, ?)", 1, "hello world") - c.Assert(err, IsNil) + require.NoError(s.T(), err) i, _ = r.RowsAffected() - c.Assert(i, Equals, int64(1)) + require.Equal(s.T(), int64(1), i) r, err = s.db.Exec("UPDATE tbl SET b = \"abc\" where a = ?", 1) - c.Assert(err, IsNil) + require.NoError(s.T(), err) i, _ = r.RowsAffected() - c.Assert(i, Equals, int64(1)) + require.Equal(s.T(), int64(1), i) r, err = s.db.Exec("DELETE FROM tbl where a = ?", 1) - c.Assert(err, IsNil) + require.NoError(s.T(), err) i, _ = r.RowsAffected() - c.Assert(i, Equals, int64(1)) + require.Equal(s.T(), int64(1), i) } type testHandler struct { diff --git a/utils/utils_test.go b/utils/utils_test.go index 3e67760c0..c8c0bf461 100644 --- a/utils/utils_test.go +++ b/utils/utils_test.go @@ -2,7 +2,5 @@ package utils // Will register common flags import ( - _ "github.com/pingcap/check" - _ "github.com/go-mysql-org/go-mysql/test_util" )