diff --git a/dm/common/common_test.go b/dm/common/common_test.go index b9dc6f11c7..636b1ade45 100644 --- a/dm/common/common_test.go +++ b/dm/common/common_test.go @@ -18,18 +18,10 @@ import ( "path" "testing" - "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -func TestCommon(t *testing.T) { - check.TestingT(t) -} - -type testCommon struct{} - -var _ = check.Suite(&testCommon{}) - -func (t *testCommon) TestKeyAdapter(c *check.C) { +func TestKeyAdapter(t *testing.T) { testCases := []struct { keys []string adapter KeyAdapter @@ -84,14 +76,14 @@ func (t *testCommon) TestKeyAdapter(c *check.C) { for _, ca := range testCases { encKey := ca.adapter.Encode(ca.keys...) - c.Assert(encKey, check.Equals, ca.want) + require.Equal(t, ca.want, encKey) decKey, err := ca.adapter.Decode(encKey) - c.Assert(err, check.IsNil) - c.Assert(decKey, check.DeepEquals, ca.keys) + require.NoError(t, err) + require.Equal(t, ca.keys, decKey) } } -func (t *testCommon) TestEncodeAsPrefix(c *check.C) { +func TestEncodeAsPrefix(t *testing.T) { testCases := []struct { keys []string adapter KeyAdapter @@ -106,22 +98,22 @@ func (t *testCommon) TestEncodeAsPrefix(c *check.C) { for _, ca := range testCases { encKey := ca.adapter.Encode(ca.keys...) - c.Assert(encKey, check.Equals, ca.want) + require.Equal(t, ca.want, encKey) _, err := ca.adapter.Decode(encKey) - c.Assert(err, check.NotNil) + require.NotNil(t, err) } } -func (t *testCommon) TestIsErrNetClosing(c *check.C) { +func TestIsErrNetClosing(t *testing.T) { server, err := net.Listen("tcp", "localhost:0") - c.Assert(err, check.IsNil) + require.NoError(t, err) err = server.Close() - c.Assert(IsErrNetClosing(err), check.IsFalse) + require.False(t, IsErrNetClosing(err)) _, err = server.Accept() - c.Assert(IsErrNetClosing(err), check.IsTrue) + require.True(t, IsErrNetClosing(err)) } -func (t *testCommon) TestJoinUseSlash(c *check.C) { +func TestJoinUseSlash(t *testing.T) { // because we use "/" in Encode - c.Assert(path.Join("a", "b"), check.Equals, "a/b") + require.Equal(t, "a/b", path.Join("a", "b")) } diff --git a/dm/config/source_converter_test.go b/dm/config/source_converter_test.go index cf044729e0..09712d5954 100644 --- a/dm/config/source_converter_test.go +++ b/dm/config/source_converter_test.go @@ -16,21 +16,13 @@ package config import ( "testing" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/openapi/fixtures" + "github.com/stretchr/testify/require" ) -func TestConfig(t *testing.T) { - check.TestingT(t) -} - -type testConfig struct{} - -var _ = check.Suite(&testConfig{}) - -func (t *testConfig) TestConverterWithSourceAndOpenAPISource(c *check.C) { +func TestConverterWithSourceAndOpenAPISource(t *testing.T) { sourceCfg1, err := SourceCfgFromYaml(SampleSourceConfig) - c.Assert(err, check.IsNil) + require.NoError(t, err) // 1. test user create source from dmctl, after convert to openapi.Source then convert back to source config sourceCfg2 := OpenAPISourceToSourceCfg(SourceCfgToOpenAPISource(sourceCfg1)) @@ -40,12 +32,12 @@ func (t *testConfig) TestConverterWithSourceAndOpenAPISource(c *check.C) { sourceCfg2.From.MaxAllowedPacket = sourceCfg1.From.MaxAllowedPacket // we only need to make sure the source config that user can see is the same as the source config that user create - c.Assert(sourceCfg1.String(), check.Equals, sourceCfg2.String()) + require.Equal(t, sourceCfg2.String(), sourceCfg1.String()) // 2. test user create source from openapi, after convert to source config then convert back to openapi.Source openapiSource1, err := fixtures.GenOpenAPISourceForTest() - c.Assert(err, check.IsNil) + require.NoError(t, err) openapiSource2 := SourceCfgToOpenAPISource(OpenAPISourceToSourceCfg(openapiSource1)) openapiSource2.Password = openapiSource1.Password // we set passwd to "******" for privacy - c.Assert(openapiSource1, check.DeepEquals, openapiSource2) + require.Equal(t, openapiSource2, openapiSource1) } diff --git a/dm/config/task_cli_args_test.go b/dm/config/task_cli_args_test.go index 515f3979a5..2ac62c5cba 100644 --- a/dm/config/task_cli_args_test.go +++ b/dm/config/task_cli_args_test.go @@ -15,8 +15,9 @@ package config import ( "encoding/json" + "testing" - "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) type testStruct struct { @@ -29,7 +30,7 @@ func (t *testStruct) ToJSON() string { return string(cfg) } -func (t *testConfig) TestTaskCliArgsDowngrade(c *check.C) { +func TestTaskCliArgsDowngrade(t *testing.T) { s := testStruct{ TaskCliArgs: TaskCliArgs{"123", "1s", "1s"}, FutureField: "456", @@ -37,38 +38,38 @@ func (t *testConfig) TestTaskCliArgsDowngrade(c *check.C) { data := s.ToJSON() expected := `{"start_time":"123","safe_mode_duration":"1s","wait_time_on_stop":"1s","future_field":"456"}` - c.Assert(data, check.Equals, expected) + require.Equal(t, expected, data) afterDowngrade := &TaskCliArgs{} - c.Assert(afterDowngrade.Decode([]byte(data)), check.IsNil) - c.Assert(afterDowngrade.StartTime, check.Equals, "123") + require.NoError(t, afterDowngrade.Decode([]byte(data))) + require.Equal(t, "123", afterDowngrade.StartTime) } -func (t *testConfig) TestTaskCliArgsVerify(c *check.C) { +func TestTaskCliArgsVerify(t *testing.T) { empty := TaskCliArgs{} - c.Assert(empty.Verify(), check.IsNil) + require.NoError(t, empty.Verify()) rightStartTime := TaskCliArgs{StartTime: "2006-01-02T15:04:05"} - c.Assert(rightStartTime.Verify(), check.IsNil) + require.NoError(t, rightStartTime.Verify()) rightStartTime = TaskCliArgs{StartTime: "2006-01-02 15:04:05"} - c.Assert(rightStartTime.Verify(), check.IsNil) + require.NoError(t, rightStartTime.Verify()) rightStartTime = TaskCliArgs{StartTime: "2006-01-02T15:04:05+08:00"} - c.Assert(rightStartTime.Verify(), check.IsNil) + require.NoError(t, rightStartTime.Verify()) rightStartTime = TaskCliArgs{StartTime: "2006-01-02 15:04:05+08:00"} - c.Assert(rightStartTime.Verify(), check.IsNil) + require.NoError(t, rightStartTime.Verify()) rightStartTime = TaskCliArgs{StartTime: "2006-01-02T15:04:05+0800"} - c.Assert(rightStartTime.Verify(), check.IsNil) + require.NoError(t, rightStartTime.Verify()) rightStartTime = TaskCliArgs{StartTime: "2006-01-02 15:04:05+0800"} - c.Assert(rightStartTime.Verify(), check.IsNil) + require.NoError(t, rightStartTime.Verify()) wrongStartTime := TaskCliArgs{StartTime: "15:04:05"} - c.Assert(wrongStartTime.Verify(), check.NotNil) + require.Error(t, wrongStartTime.Verify()) rightSafeModeDuration := TaskCliArgs{SafeModeDuration: "1s"} - c.Assert(rightSafeModeDuration.Verify(), check.IsNil) + require.NoError(t, rightSafeModeDuration.Verify()) wrongSafeModeDuration := TaskCliArgs{SafeModeDuration: "1"} - c.Assert(wrongSafeModeDuration.Verify(), check.NotNil) + require.Error(t, wrongSafeModeDuration.Verify()) rightWaitTimeOnStop := TaskCliArgs{WaitTimeOnStop: "1s"} - c.Assert(rightWaitTimeOnStop.Verify(), check.IsNil) + require.NoError(t, rightWaitTimeOnStop.Verify()) wrongWaitTimeOnStop := TaskCliArgs{WaitTimeOnStop: "1"} - c.Assert(wrongWaitTimeOnStop.Verify(), check.NotNil) + require.Error(t, wrongWaitTimeOnStop.Verify()) } diff --git a/dm/config/task_converters_test.go b/dm/config/task_converters_test.go index 98f06ae943..3452a268e0 100644 --- a/dm/config/task_converters_test.go +++ b/dm/config/task_converters_test.go @@ -17,7 +17,6 @@ import ( "testing" "github.com/google/uuid" - "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/util/filter" "github.com/pingcap/tiflow/dm/config/dbconfig" "github.com/pingcap/tiflow/dm/config/security" @@ -28,7 +27,7 @@ import ( "github.com/stretchr/testify/require" ) -func (t *testConfig) TestTaskGetTargetDBCfg(c *check.C) { +func TestTaskGetTargetDBCfg(t *testing.T) { certAllowedCn := []string{"test"} task := &openapi.Task{ TargetConfig: openapi.TaskTargetDataBase{ @@ -40,24 +39,24 @@ func (t *testConfig) TestTaskGetTargetDBCfg(c *check.C) { }, } dbCfg := GetTargetDBCfgFromOpenAPITask(task) - c.Assert(dbCfg.Host, check.Equals, task.TargetConfig.Host) - c.Assert(dbCfg.Password, check.Equals, task.TargetConfig.Password) - c.Assert(dbCfg.Port, check.Equals, task.TargetConfig.Port) - c.Assert(dbCfg.User, check.Equals, task.TargetConfig.User) - c.Assert(dbCfg.Security, check.NotNil) - c.Assert([]string{dbCfg.Security.CertAllowedCN[0]}, check.DeepEquals, certAllowedCn) + require.Equal(t, task.TargetConfig.Host, dbCfg.Host) + require.Equal(t, task.TargetConfig.Password, dbCfg.Password) + require.Equal(t, task.TargetConfig.Port, dbCfg.Port) + require.Equal(t, task.TargetConfig.User, dbCfg.User) + require.NotNil(t, dbCfg.Security) + require.Equal(t, certAllowedCn, []string{dbCfg.Security.CertAllowedCN[0]}) } -func (t *testConfig) TestOpenAPITaskToSubTaskConfigs(c *check.C) { - testNoShardTaskToSubTaskConfigs(c) - testShardAndFilterTaskToSubTaskConfigs(c) +func TestOpenAPITaskToSubTaskConfigs(t *testing.T) { + testNoShardTaskToSubTaskConfigs(t) + testShardAndFilterTaskToSubTaskConfigs(t) } -func testNoShardTaskToSubTaskConfigs(c *check.C) { +func testNoShardTaskToSubTaskConfigs(t *testing.T) { task, err := fixtures.GenNoShardOpenAPITaskForTest() - c.Assert(err, check.IsNil) + require.NoError(t, err) sourceCfg1, err := SourceCfgFromYamlAndVerify(SampleSourceConfig) - c.Assert(err, check.IsNil) + require.NoError(t, err) source1Name := task.SourceConfig.SourceConf[0].SourceName sourceCfg1.SourceID = task.SourceConfig.SourceConf[0].SourceName sourceCfgMap := map[string]*SourceConfig{source1Name: sourceCfg1} @@ -77,33 +76,33 @@ func testNoShardTaskToSubTaskConfigs(c *check.C) { newMeta := "new_dm_meta" task.MetaSchema = &newMeta subTaskConfigList, err := OpenAPITaskToSubTaskConfigs(&task, toDBCfg, sourceCfgMap) - c.Assert(err, check.IsNil) - c.Assert(subTaskConfigList, check.HasLen, 1) + require.NoError(t, err) + require.Len(t, subTaskConfigList, 1) subTaskConfig := subTaskConfigList[0] // check task name and mode - c.Assert(subTaskConfig.Name, check.Equals, task.Name) + require.Equal(t, task.Name, subTaskConfig.Name) // check task meta - c.Assert(subTaskConfig.MetaSchema, check.Equals, *task.MetaSchema) - c.Assert(subTaskConfig.Meta, check.IsNil) + require.Equal(t, *task.MetaSchema, subTaskConfig.MetaSchema) + require.Nil(t, subTaskConfig.Meta) // check shard config - c.Assert(subTaskConfig.ShardMode, check.Equals, "") + require.Equal(t, "", subTaskConfig.ShardMode) // check online schema change - c.Assert(subTaskConfig.OnlineDDL, check.Equals, true) + require.Equal(t, true, subTaskConfig.OnlineDDL) // check case sensitive - c.Assert(subTaskConfig.CaseSensitive, check.Equals, sourceCfg1.CaseSensitive) + require.Equal(t, sourceCfg1.CaseSensitive, subTaskConfig.CaseSensitive) // check from - c.Assert(subTaskConfig.From.Host, check.Equals, sourceCfg1.From.Host) + require.Equal(t, sourceCfg1.From.Host, subTaskConfig.From.Host) // check to - c.Assert(subTaskConfig.To.Host, check.Equals, toDBCfg.Host) + require.Equal(t, toDBCfg.Host, subTaskConfig.To.Host) // check dumpling loader syncer config - c.Assert(subTaskConfig.MydumperConfig.Threads, check.Equals, *task.SourceConfig.FullMigrateConf.ExportThreads) - c.Assert(subTaskConfig.LoaderConfig.Dir, check.Equals, fmt.Sprintf( - "%s.%s", *task.SourceConfig.FullMigrateConf.DataDir, task.Name)) - c.Assert(subTaskConfig.LoaderConfig.PoolSize, check.Equals, *task.SourceConfig.FullMigrateConf.ImportThreads) - c.Assert(subTaskConfig.SyncerConfig.WorkerCount, check.Equals, *task.SourceConfig.IncrMigrateConf.ReplThreads) - c.Assert(subTaskConfig.SyncerConfig.Batch, check.Equals, *task.SourceConfig.IncrMigrateConf.ReplBatch) + require.Equal(t, *task.SourceConfig.FullMigrateConf.ExportThreads, subTaskConfig.MydumperConfig.Threads) + require.Equal(t, fmt.Sprintf( + "%s.%s", *task.SourceConfig.FullMigrateConf.DataDir, task.Name), subTaskConfig.LoaderConfig.Dir) + require.Equal(t, *task.SourceConfig.FullMigrateConf.ImportThreads, subTaskConfig.LoaderConfig.PoolSize) + require.Equal(t, *task.SourceConfig.IncrMigrateConf.ReplThreads, subTaskConfig.SyncerConfig.WorkerCount) + require.Equal(t, *task.SourceConfig.IncrMigrateConf.ReplBatch, subTaskConfig.SyncerConfig.Batch) // check route - c.Assert(subTaskConfig.RouteRules, check.HasLen, 1) + require.Len(t, subTaskConfig.RouteRules, 1) rule := subTaskConfig.RouteRules[0] sourceSchema := task.TableMigrateRule[0].Source.Schema @@ -111,45 +110,45 @@ func testNoShardTaskToSubTaskConfigs(c *check.C) { tartgetSchema := task.TableMigrateRule[0].Target.Schema tartgetTable := task.TableMigrateRule[0].Target.Table - c.Assert(rule.SchemaPattern, check.Equals, sourceSchema) - c.Assert(rule.TablePattern, check.Equals, sourceTable) - c.Assert(rule.TargetSchema, check.Equals, *tartgetSchema) - c.Assert(rule.TargetTable, check.Equals, *tartgetTable) + require.Equal(t, sourceSchema, rule.SchemaPattern) + require.Equal(t, sourceTable, rule.TablePattern) + require.Equal(t, *tartgetSchema, rule.TargetSchema) + require.Equal(t, *tartgetTable, rule.TargetTable) // check filter - c.Assert(subTaskConfig.FilterRules, check.HasLen, 0) + require.Len(t, subTaskConfig.FilterRules, 0) // check balist - c.Assert(subTaskConfig.BAList, check.NotNil) + require.NotNil(t, subTaskConfig.BAList) bAListFromOpenAPITask := &filter.Rules{ DoTables: []*filter.Table{{Schema: sourceSchema, Name: sourceTable}}, } - c.Assert(subTaskConfig.BAList, check.DeepEquals, bAListFromOpenAPITask) + require.Equal(t, bAListFromOpenAPITask, subTaskConfig.BAList) // check ignore check items - c.Assert(subTaskConfig.IgnoreCheckingItems, check.IsNil) + require.Nil(t, subTaskConfig.IgnoreCheckingItems) // check io total bytes counter and uuid - c.Assert(subTaskConfig.IOTotalBytes, check.NotNil) - c.Assert(subTaskConfig.DumpIOTotalBytes, check.NotNil) - c.Assert(subTaskConfig.IOTotalBytes.Load(), check.Equals, uint64(0)) - c.Assert(subTaskConfig.DumpIOTotalBytes.Load(), check.Equals, uint64(0)) - c.Assert(subTaskConfig.UUID, check.HasLen, len(uuid.NewString())) - c.Assert(subTaskConfig.DumpUUID, check.HasLen, len(uuid.NewString())) + require.NotNil(t, subTaskConfig.IOTotalBytes) + require.NotNil(t, subTaskConfig.DumpIOTotalBytes) + require.Equal(t, uint64(0), subTaskConfig.IOTotalBytes.Load()) + require.Equal(t, uint64(0), subTaskConfig.DumpIOTotalBytes.Load()) + require.Len(t, subTaskConfig.UUID, len(uuid.NewString())) + require.Len(t, subTaskConfig.DumpUUID, len(uuid.NewString())) // check security items - c.Assert(string(subTaskConfig.To.Security.SSLCABytes), check.Equals, task.TargetConfig.Security.SslCaContent) - c.Assert(string(subTaskConfig.To.Security.SSLCertBytes), check.Equals, task.TargetConfig.Security.SslCertContent) - c.Assert(string(subTaskConfig.To.Security.SSLKeyBytes), check.Equals, task.TargetConfig.Security.SslKeyContent) - c.Assert(string(subTaskConfig.LoaderConfig.Security.SSLCABytes), check.Equals, task.SourceConfig.FullMigrateConf.Security.SslCaContent) - c.Assert(string(subTaskConfig.LoaderConfig.Security.SSLCertBytes), check.Equals, task.SourceConfig.FullMigrateConf.Security.SslCertContent) - c.Assert(string(subTaskConfig.LoaderConfig.Security.SSLKeyBytes), check.Equals, task.SourceConfig.FullMigrateConf.Security.SslKeyContent) + require.Equal(t, task.TargetConfig.Security.SslCaContent, string(subTaskConfig.To.Security.SSLCABytes)) + require.Equal(t, task.TargetConfig.Security.SslCertContent, string(subTaskConfig.To.Security.SSLCertBytes)) + require.Equal(t, task.TargetConfig.Security.SslKeyContent, string(subTaskConfig.To.Security.SSLKeyBytes)) + require.Equal(t, task.SourceConfig.FullMigrateConf.Security.SslCaContent, string(subTaskConfig.LoaderConfig.Security.SSLCABytes)) + require.Equal(t, task.SourceConfig.FullMigrateConf.Security.SslCertContent, string(subTaskConfig.LoaderConfig.Security.SSLCertBytes)) + require.Equal(t, task.SourceConfig.FullMigrateConf.Security.SslKeyContent, string(subTaskConfig.LoaderConfig.Security.SSLKeyBytes)) } -func testShardAndFilterTaskToSubTaskConfigs(c *check.C) { +func testShardAndFilterTaskToSubTaskConfigs(t *testing.T) { task, err := fixtures.GenShardAndFilterOpenAPITaskForTest() - c.Assert(err, check.IsNil) + require.NoError(t, err) sourceCfg1, err := SourceCfgFromYamlAndVerify(SampleSourceConfig) - c.Assert(err, check.IsNil) + require.NoError(t, err) source1Name := task.SourceConfig.SourceConf[0].SourceName sourceCfg1.SourceID = source1Name sourceCfg2, err := SourceCfgFromYamlAndVerify(SampleSourceConfig) - c.Assert(err, check.IsNil) + require.NoError(t, err) source2Name := task.SourceConfig.SourceConf[1].SourceName sourceCfg2.SourceID = source2Name @@ -161,54 +160,54 @@ func testShardAndFilterTaskToSubTaskConfigs(c *check.C) { } sourceCfgMap := map[string]*SourceConfig{source1Name: sourceCfg1, source2Name: sourceCfg2} subTaskConfigList, err := OpenAPITaskToSubTaskConfigs(&task, toDBCfg, sourceCfgMap) - c.Assert(err, check.IsNil) - c.Assert(subTaskConfigList, check.HasLen, 2) + require.NoError(t, err) + require.Len(t, subTaskConfigList, 2) // check sub task 1 subTask1Config := subTaskConfigList[0] // check task name and mode - c.Assert(subTask1Config.Name, check.Equals, task.Name) + require.Equal(t, task.Name, subTask1Config.Name) // check task meta - c.Assert(subTask1Config.MetaSchema, check.Equals, *task.MetaSchema) - c.Assert(subTask1Config.Meta, check.NotNil) - c.Assert(subTask1Config.Meta.BinLogGTID, check.Equals, *task.SourceConfig.SourceConf[0].BinlogGtid) - c.Assert(subTask1Config.Meta.BinLogName, check.Equals, *task.SourceConfig.SourceConf[0].BinlogName) - c.Assert(subTask1Config.Meta.BinLogPos, check.Equals, uint32(*task.SourceConfig.SourceConf[0].BinlogPos)) + require.Equal(t, *task.MetaSchema, subTask1Config.MetaSchema) + require.NotNil(t, subTask1Config.Meta) + require.Equal(t, *task.SourceConfig.SourceConf[0].BinlogGtid, subTask1Config.Meta.BinLogGTID) + require.Equal(t, *task.SourceConfig.SourceConf[0].BinlogName, subTask1Config.Meta.BinLogName) + require.Equal(t, uint32(*task.SourceConfig.SourceConf[0].BinlogPos), subTask1Config.Meta.BinLogPos) // check shard config - c.Assert(subTask1Config.ShardMode, check.Equals, string(openapi.TaskShardModeOptimistic)) - c.Assert(subTask1Config.StrictOptimisticShardMode, check.IsTrue) + require.Equal(t, string(openapi.TaskShardModeOptimistic), subTask1Config.ShardMode) + require.True(t, subTask1Config.StrictOptimisticShardMode) // check online schema change - c.Assert(subTask1Config.OnlineDDL, check.Equals, true) + require.Equal(t, true, subTask1Config.OnlineDDL) // check case sensitive - c.Assert(subTask1Config.CaseSensitive, check.Equals, sourceCfg1.CaseSensitive) + require.Equal(t, sourceCfg1.CaseSensitive, subTask1Config.CaseSensitive) // check from - c.Assert(subTask1Config.From.Host, check.Equals, sourceCfg1.From.Host) + require.Equal(t, sourceCfg1.From.Host, subTask1Config.From.Host) // check to - c.Assert(subTask1Config.To.Host, check.Equals, toDBCfg.Host) + require.Equal(t, toDBCfg.Host, subTask1Config.To.Host) // check dumpling loader syncer config - c.Assert(subTask1Config.MydumperConfig.Threads, check.Equals, *task.SourceConfig.FullMigrateConf.ExportThreads) - c.Assert(subTask1Config.LoaderConfig.Dir, check.Equals, fmt.Sprintf( - "%s.%s", *task.SourceConfig.FullMigrateConf.DataDir, task.Name)) - c.Assert(subTask1Config.LoaderConfig.PoolSize, check.Equals, *task.SourceConfig.FullMigrateConf.ImportThreads) - c.Assert(subTask1Config.SyncerConfig.WorkerCount, check.Equals, *task.SourceConfig.IncrMigrateConf.ReplThreads) - c.Assert(subTask1Config.SyncerConfig.Batch, check.Equals, *task.SourceConfig.IncrMigrateConf.ReplBatch) + require.Equal(t, *task.SourceConfig.FullMigrateConf.ExportThreads, subTask1Config.MydumperConfig.Threads) + require.Equal(t, fmt.Sprintf( + "%s.%s", *task.SourceConfig.FullMigrateConf.DataDir, task.Name), subTask1Config.LoaderConfig.Dir) + require.Equal(t, *task.SourceConfig.FullMigrateConf.ImportThreads, subTask1Config.LoaderConfig.PoolSize) + require.Equal(t, *task.SourceConfig.IncrMigrateConf.ReplThreads, subTask1Config.SyncerConfig.WorkerCount) + require.Equal(t, *task.SourceConfig.IncrMigrateConf.ReplBatch, subTask1Config.SyncerConfig.Batch) // check route - c.Assert(subTask1Config.RouteRules, check.HasLen, 1) + require.Len(t, subTask1Config.RouteRules, 1) rule := subTask1Config.RouteRules[0] source1Schema := task.TableMigrateRule[0].Source.Schema source1Table := task.TableMigrateRule[0].Source.Table tartgetSchema := task.TableMigrateRule[0].Target.Schema tartgetTable := task.TableMigrateRule[0].Target.Table - c.Assert(rule.SchemaPattern, check.Equals, source1Schema) - c.Assert(rule.TablePattern, check.Equals, source1Table) - c.Assert(rule.TargetSchema, check.Equals, *tartgetSchema) - c.Assert(rule.TargetTable, check.Equals, *tartgetTable) + require.Equal(t, source1Schema, rule.SchemaPattern) + require.Equal(t, source1Table, rule.TablePattern) + require.Equal(t, *tartgetSchema, rule.TargetSchema) + require.Equal(t, *tartgetTable, rule.TargetTable) // check filter filterARule, ok := task.BinlogFilterRule.Get("filterA") - c.Assert(ok, check.IsTrue) + require.True(t, ok) filterIgnoreEvents := *filterARule.IgnoreEvent - c.Assert(filterIgnoreEvents, check.HasLen, 1) + require.Len(t, filterIgnoreEvents, 1) filterEvents := []bf.EventType{bf.EventType(filterIgnoreEvents[0])} filterRulesFromOpenAPITask := &bf.BinlogEventRule{ Action: bf.Ignore, @@ -217,79 +216,79 @@ func testShardAndFilterTaskToSubTaskConfigs(c *check.C) { SchemaPattern: source1Schema, TablePattern: source1Table, } - c.Assert(filterRulesFromOpenAPITask.Valid(), check.IsNil) - c.Assert(subTask1Config.FilterRules, check.HasLen, 1) - c.Assert(subTask1Config.FilterRules[0], check.DeepEquals, filterRulesFromOpenAPITask) + require.NoError(t, filterRulesFromOpenAPITask.Valid()) + require.Len(t, subTask1Config.FilterRules, 1) + require.Equal(t, filterRulesFromOpenAPITask, subTask1Config.FilterRules[0]) // check balist - c.Assert(subTask1Config.BAList, check.NotNil) + require.NotNil(t, subTask1Config.BAList) bAListFromOpenAPITask := &filter.Rules{ DoTables: []*filter.Table{{Schema: source1Schema, Name: source1Table}}, } - c.Assert(subTask1Config.BAList, check.DeepEquals, bAListFromOpenAPITask) + require.Equal(t, bAListFromOpenAPITask, subTask1Config.BAList) // check ignore check items - c.Assert(subTask1Config.IgnoreCheckingItems, check.IsNil) + require.Nil(t, subTask1Config.IgnoreCheckingItems) // check sub task 2 subTask2Config := subTaskConfigList[1] // check task name and mode - c.Assert(subTask2Config.Name, check.Equals, task.Name) + require.Equal(t, task.Name, subTask2Config.Name) // check task meta - c.Assert(subTask2Config.MetaSchema, check.Equals, *task.MetaSchema) - c.Assert(subTask2Config.Meta, check.NotNil) - c.Assert(subTask2Config.Meta.BinLogGTID, check.Equals, *task.SourceConfig.SourceConf[1].BinlogGtid) - c.Assert(subTask2Config.Meta.BinLogName, check.Equals, *task.SourceConfig.SourceConf[1].BinlogName) - c.Assert(subTask2Config.Meta.BinLogPos, check.Equals, uint32(*task.SourceConfig.SourceConf[1].BinlogPos)) + require.Equal(t, *task.MetaSchema, subTask2Config.MetaSchema) + require.NotNil(t, subTask2Config.Meta) + require.Equal(t, *task.SourceConfig.SourceConf[1].BinlogGtid, subTask2Config.Meta.BinLogGTID) + require.Equal(t, *task.SourceConfig.SourceConf[1].BinlogName, subTask2Config.Meta.BinLogName) + require.Equal(t, uint32(*task.SourceConfig.SourceConf[1].BinlogPos), subTask2Config.Meta.BinLogPos) // check shard config - c.Assert(subTask2Config.ShardMode, check.Equals, string(openapi.TaskShardModeOptimistic)) + require.Equal(t, string(openapi.TaskShardModeOptimistic), subTask2Config.ShardMode) // check online schema change - c.Assert(subTask2Config.OnlineDDL, check.Equals, true) + require.Equal(t, true, subTask2Config.OnlineDDL) // check case sensitive - c.Assert(subTask2Config.CaseSensitive, check.Equals, sourceCfg2.CaseSensitive) + require.Equal(t, sourceCfg2.CaseSensitive, subTask2Config.CaseSensitive) // check from - c.Assert(subTask2Config.From.Host, check.Equals, sourceCfg2.From.Host) + require.Equal(t, sourceCfg2.From.Host, subTask2Config.From.Host) // check to - c.Assert(subTask2Config.To.Host, check.Equals, toDBCfg.Host) + require.Equal(t, toDBCfg.Host, subTask2Config.To.Host) // check dumpling loader syncer config - c.Assert(subTask2Config.MydumperConfig.Threads, check.Equals, *task.SourceConfig.FullMigrateConf.ExportThreads) - c.Assert(subTask2Config.LoaderConfig.Dir, check.Equals, fmt.Sprintf( - "%s.%s", *task.SourceConfig.FullMigrateConf.DataDir, task.Name)) - c.Assert(subTask2Config.LoaderConfig.PoolSize, check.Equals, *task.SourceConfig.FullMigrateConf.ImportThreads) - c.Assert(subTask2Config.SyncerConfig.WorkerCount, check.Equals, *task.SourceConfig.IncrMigrateConf.ReplThreads) - c.Assert(subTask2Config.SyncerConfig.Batch, check.Equals, *task.SourceConfig.IncrMigrateConf.ReplBatch) + require.Equal(t, *task.SourceConfig.FullMigrateConf.ExportThreads, subTask2Config.MydumperConfig.Threads) + require.Equal(t, fmt.Sprintf( + "%s.%s", *task.SourceConfig.FullMigrateConf.DataDir, task.Name), subTask2Config.LoaderConfig.Dir) + require.Equal(t, *task.SourceConfig.FullMigrateConf.ImportThreads, subTask2Config.LoaderConfig.PoolSize) + require.Equal(t, *task.SourceConfig.IncrMigrateConf.ReplThreads, subTask2Config.SyncerConfig.WorkerCount) + require.Equal(t, *task.SourceConfig.IncrMigrateConf.ReplBatch, subTask2Config.SyncerConfig.Batch) // check route - c.Assert(subTask2Config.RouteRules, check.HasLen, 1) + require.Len(t, subTask2Config.RouteRules, 1) rule = subTask2Config.RouteRules[0] source2Schema := task.TableMigrateRule[1].Source.Schema source2Table := task.TableMigrateRule[1].Source.Table - c.Assert(rule.SchemaPattern, check.Equals, source2Schema) - c.Assert(rule.TablePattern, check.Equals, source2Table) - c.Assert(rule.TargetSchema, check.Equals, *tartgetSchema) - c.Assert(rule.TargetTable, check.Equals, *tartgetTable) + require.Equal(t, source2Schema, rule.SchemaPattern) + require.Equal(t, source2Table, rule.TablePattern) + require.Equal(t, *tartgetSchema, rule.TargetSchema) + require.Equal(t, *tartgetTable, rule.TargetTable) // check filter _, ok = task.BinlogFilterRule.Get("filterB") - c.Assert(ok, check.IsFalse) - c.Assert(subTask2Config.FilterRules, check.HasLen, 0) + require.False(t, ok) + require.Len(t, subTask2Config.FilterRules, 0) // check balist - c.Assert(subTask2Config.BAList, check.NotNil) + require.NotNil(t, subTask2Config.BAList) bAListFromOpenAPITask = &filter.Rules{ DoTables: []*filter.Table{{Schema: source2Schema, Name: source2Table}}, } - c.Assert(subTask2Config.BAList, check.DeepEquals, bAListFromOpenAPITask) + require.Equal(t, bAListFromOpenAPITask, subTask2Config.BAList) // check ignore check items - c.Assert(subTask2Config.IgnoreCheckingItems, check.IsNil) + require.Nil(t, subTask2Config.IgnoreCheckingItems) } -func (t *testConfig) TestSubTaskConfigsToOpenAPITask(c *check.C) { - testNoShardSubTaskConfigsToOpenAPITask(c) - testShardAndFilterSubTaskConfigsToOpenAPITask(c) +func TestSubTaskConfigsToOpenAPITask(t *testing.T) { + testNoShardSubTaskConfigsToOpenAPITask(t) + testShardAndFilterSubTaskConfigsToOpenAPITask(t) } -func testNoShardSubTaskConfigsToOpenAPITask(c *check.C) { +func testNoShardSubTaskConfigsToOpenAPITask(t *testing.T) { task, err := fixtures.GenNoShardOpenAPITaskForTest() - c.Assert(err, check.IsNil) + require.NoError(t, err) sourceCfg1, err := SourceCfgFromYamlAndVerify(SampleSourceConfig) - c.Assert(err, check.IsNil) + require.NoError(t, err) source1Name := task.SourceConfig.SourceConf[0].SourceName sourceCfg1.SourceID = task.SourceConfig.SourceConf[0].SourceName sourceCfgMap := map[string]*SourceConfig{source1Name: sourceCfg1} @@ -306,8 +305,8 @@ func testNoShardSubTaskConfigsToOpenAPITask(c *check.C) { }, } subTaskConfigList, err := OpenAPITaskToSubTaskConfigs(&task, toDBCfg, sourceCfgMap) - c.Assert(err, check.IsNil) - c.Assert(subTaskConfigList, check.HasLen, 1) + require.NoError(t, err) + require.Len(t, subTaskConfigList, 1) // prepare sub task config subTaskConfigMap := make(map[string]map[string]*SubTaskConfig) @@ -315,20 +314,20 @@ func testNoShardSubTaskConfigsToOpenAPITask(c *check.C) { subTaskConfigMap[task.Name][source1Name] = subTaskConfigList[0] taskList := SubTaskConfigsToOpenAPITaskList(subTaskConfigMap) - c.Assert(taskList, check.HasLen, 1) + require.Len(t, taskList, 1) newTask := taskList[0] - c.Assert(&task, check.DeepEquals, newTask) + require.Equal(t, newTask, &task) } -func testShardAndFilterSubTaskConfigsToOpenAPITask(c *check.C) { +func testShardAndFilterSubTaskConfigsToOpenAPITask(t *testing.T) { task, err := fixtures.GenShardAndFilterOpenAPITaskForTest() - c.Assert(err, check.IsNil) + require.NoError(t, err) sourceCfg1, err := SourceCfgFromYamlAndVerify(SampleSourceConfig) - c.Assert(err, check.IsNil) + require.NoError(t, err) source1Name := task.SourceConfig.SourceConf[0].SourceName sourceCfg1.SourceID = source1Name sourceCfg2, err := SourceCfgFromYamlAndVerify(SampleSourceConfig) - c.Assert(err, check.IsNil) + require.NoError(t, err) source2Name := task.SourceConfig.SourceConf[1].SourceName sourceCfg2.SourceID = source2Name @@ -340,8 +339,8 @@ func testShardAndFilterSubTaskConfigsToOpenAPITask(c *check.C) { } sourceCfgMap := map[string]*SourceConfig{source1Name: sourceCfg1, source2Name: sourceCfg2} subTaskConfigList, err := OpenAPITaskToSubTaskConfigs(&task, toDBCfg, sourceCfgMap) - c.Assert(err, check.IsNil) - c.Assert(subTaskConfigList, check.HasLen, 2) + require.NoError(t, err) + require.Len(t, subTaskConfigList, 2) // prepare sub task config subTaskConfigMap := make(map[string]map[string]*SubTaskConfig) @@ -350,14 +349,14 @@ func testShardAndFilterSubTaskConfigsToOpenAPITask(c *check.C) { subTaskConfigMap[task.Name][source2Name] = subTaskConfigList[1] taskList := SubTaskConfigsToOpenAPITaskList(subTaskConfigMap) - c.Assert(taskList, check.HasLen, 1) + require.Len(t, taskList, 1) newTask := taskList[0] // because subtask config not have filter-rule-name, so we need to add it manually oldRuleName := "filterA" newRuleName := genFilterRuleName(source1Name, 0) oldRule, ok := task.BinlogFilterRule.Get(oldRuleName) - c.Assert(ok, check.IsTrue) + require.True(t, ok) newRule := openapi.Task_BinlogFilterRule{} newRule.Set(newRuleName, oldRule) task.BinlogFilterRule = &newRule @@ -372,7 +371,7 @@ func testShardAndFilterSubTaskConfigsToOpenAPITask(c *check.C) { task.TableMigrateRule[0], task.TableMigrateRule[1] = task.TableMigrateRule[1], task.TableMigrateRule[0] } - c.Assert(&task, check.DeepEquals, newTask) + require.Equal(t, newTask, &task) } func TestConvertWithIgnoreCheckItems(t *testing.T) { diff --git a/dm/ctl/common/config_test.go b/dm/ctl/common/config_test.go index a052ee2d7d..3e419112ea 100644 --- a/dm/ctl/common/config_test.go +++ b/dm/ctl/common/config_test.go @@ -16,18 +16,10 @@ package common import ( "testing" - "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -func TestConfig(t *testing.T) { - check.TestingT(t) -} - -var _ = check.Suite(&testConfigSuite{}) - -type testConfigSuite struct{} - -func (t *testConfigSuite) TestInteractiveQuotes(c *check.C) { +func TestInteractiveQuotes(t *testing.T) { cases := []struct { input string expected []string @@ -48,6 +40,6 @@ func (t *testConfigSuite) TestInteractiveQuotes(c *check.C) { for _, ca := range cases { got := SplitArgsRespectQuote(ca.input) - c.Assert(got, check.DeepEquals, ca.expected) + require.Equal(t, ca.expected, got) } } diff --git a/dm/ctl/master/operate_task_test.go b/dm/ctl/master/operate_task_test.go index d21270e2b9..9005ae2cde 100644 --- a/dm/ctl/master/operate_task_test.go +++ b/dm/ctl/master/operate_task_test.go @@ -14,50 +14,52 @@ package master import ( - "github.com/pingcap/check" + "testing" + "github.com/spf13/cobra" + "github.com/stretchr/testify/require" ) -func (t *testCtlMaster) TestParseBatchTaskParameters(c *check.C) { +func TestParseBatchTaskParameters(t *testing.T) { { cmd := prepareTestCmd() _ = cmd.ParseFlags([]string{"task-name"}) _, _, err := parseOperateSourceTaskParams(cmd) - c.Assert(err, check.Not(check.IsNil)) + require.Error(t, err) } { cmd := prepareTestCmd() _, _, err := parseOperateSourceTaskParams(cmd) - c.Assert(err, check.Not(check.IsNil)) + require.Error(t, err) } { cmd := prepareTestCmd() _ = cmd.ParseFlags([]string{"-s", "source-name", "-s", "source-name2"}) _, _, err := parseOperateSourceTaskParams(cmd) - c.Assert(err, check.Not(check.IsNil)) + require.Error(t, err) } { cmd := prepareTestCmd() _ = cmd.ParseFlags([]string{"-s", "source-name"}) source, _, err := parseOperateSourceTaskParams(cmd) - c.Assert(source, check.Equals, "source-name") - c.Assert(err, check.IsNil) + require.Equal(t, "source-name", source) + require.NoError(t, err) } { cmd := prepareTestCmd() _ = cmd.ParseFlags([]string{"-s", "source-name"}) source, batchSize, err := parseOperateSourceTaskParams(cmd) - c.Assert(source, check.Equals, "source-name") - c.Assert(batchSize, check.Equals, defaultBatchSize) - c.Assert(err, check.IsNil) + require.Equal(t, "source-name", source) + require.Equal(t, defaultBatchSize, batchSize) + require.NoError(t, err) } { cmd := prepareTestCmd() _ = cmd.ParseFlags([]string{"-s", "source-name", "--batch-size", "2"}) source, batchSize, err := parseOperateSourceTaskParams(cmd) - c.Assert(source, check.Equals, "source-name") - c.Assert(batchSize, check.Equals, 2) - c.Assert(err, check.IsNil) + require.Equal(t, "source-name", source) + require.Equal(t, 2, batchSize) + require.NoError(t, err) } } diff --git a/dm/ctl/master/query_status_test.go b/dm/ctl/master/query_status_test.go index df6dee021c..3c34c7a925 100644 --- a/dm/ctl/master/query_status_test.go +++ b/dm/ctl/master/query_status_test.go @@ -17,36 +17,28 @@ import ( "sort" "testing" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/pb" + "github.com/stretchr/testify/require" ) -func TestCtlMaster(t *testing.T) { - check.TestingT(t) -} - -type testCtlMaster struct{} - -var _ = check.Suite(&testCtlMaster{}) - -func generateAndCheckTaskResult(c *check.C, resp *pb.QueryStatusListResponse, expectedResult []*taskInfo) { +func generateAndCheckTaskResult(t *testing.T, resp *pb.QueryStatusListResponse, expectedResult []*taskInfo) { result, hasFalseResult := wrapTaskResult(resp) - c.Assert(hasFalseResult, check.IsFalse) - c.Assert(result.Result, check.IsTrue) - c.Assert(result.Tasks, check.HasLen, 1) + require.False(t, hasFalseResult) + require.True(t, result.Result) + require.Len(t, result.Tasks, 1) sort.Strings(result.Tasks[0].Sources) - c.Assert(result.Tasks, check.DeepEquals, expectedResult) + require.Equal(t, expectedResult, result.Tasks) } -func subTestSameSubTaskStatus(c *check.C, resp *pb.QueryStatusListResponse, expectedResult []*taskInfo, stage pb.Stage) { +func subTestSameSubTaskStatus(t *testing.T, resp *pb.QueryStatusListResponse, expectedResult []*taskInfo, stage pb.Stage) { for i := range resp.Sources { resp.Sources[i].SubTaskStatus[0].Stage = stage } expectedResult[0].TaskStatus = stage.String() - generateAndCheckTaskResult(c, resp, expectedResult) + generateAndCheckTaskResult(t, resp, expectedResult) } -func (t *testCtlMaster) TestWrapTaskResult(c *check.C) { +func TestWrapTaskResult(t *testing.T) { resp := new(pb.QueryStatusListResponse) resp.Result = true @@ -86,7 +78,7 @@ func (t *testCtlMaster) TestWrapTaskResult(c *check.C) { TaskStatus: stageError + " - Some error occurred in subtask" + extraInfo, Sources: []string{"mysql-replica-01", "mysql-replica-02", "mysql-replica-03"}, }} - generateAndCheckTaskResult(c, resp, expectedResult) + generateAndCheckTaskResult(t, resp, expectedResult) // Should return error when subtask unit is "Sync" while relay status is not running resp.Sources[2].SubTaskStatus[0].Result = nil resp.Sources[0].SubTaskStatus[0].Unit = pb.UnitType_Sync @@ -98,31 +90,31 @@ func (t *testCtlMaster) TestWrapTaskResult(c *check.C) { }, } expectedResult[0].TaskStatus = stageError + " - Relay status is " + stageError + extraInfo - generateAndCheckTaskResult(c, resp, expectedResult) + generateAndCheckTaskResult(t, resp, expectedResult) // relay status is Paused resp.Sources[0].SourceStatus.RelayStatus = &pb.RelayStatus{Stage: pb.Stage_Paused} expectedResult[0].TaskStatus = stageError + " - Relay status is " + pb.Stage_Paused.String() + extraInfo - generateAndCheckTaskResult(c, resp, expectedResult) + generateAndCheckTaskResult(t, resp, expectedResult) // relay status is Stopped resp.Sources[0].SourceStatus.RelayStatus = &pb.RelayStatus{Stage: pb.Stage_Stopped} expectedResult[0].TaskStatus = stageError + " - Relay status is " + pb.Stage_Stopped.String() + extraInfo - generateAndCheckTaskResult(c, resp, expectedResult) + generateAndCheckTaskResult(t, resp, expectedResult) // one subtask is paused and no error occurs, should return paused resp.Sources[2].SubTaskStatus[0].Result = nil resp.Sources[0].SubTaskStatus[0].Unit = 0 resp.Sources[0].SourceStatus.RelayStatus = nil expectedResult[0].TaskStatus = pb.Stage_Paused.String() - generateAndCheckTaskResult(c, resp, expectedResult) + generateAndCheckTaskResult(t, resp, expectedResult) // All subtasks are Finished/Stopped/.../New stageArray := []pb.Stage{pb.Stage_Finished, pb.Stage_Stopped, pb.Stage_Paused, pb.Stage_Running, pb.Stage_New} for _, stage := range stageArray { - subTestSameSubTaskStatus(c, resp, expectedResult, stage) + subTestSameSubTaskStatus(t, resp, expectedResult, stage) } // All subtasks are New except the last one(which is Finished) resp.Sources[2].SubTaskStatus[0].Stage = pb.Stage_Finished expectedResult[0].TaskStatus = pb.Stage_Running.String() - generateAndCheckTaskResult(c, resp, expectedResult) + generateAndCheckTaskResult(t, resp, expectedResult) // test situation with two tasks resp.Sources = append(resp.Sources, &pb.QueryStatusResponse{ @@ -137,8 +129,8 @@ func (t *testCtlMaster) TestWrapTaskResult(c *check.C) { }}, }) result, hasFalseResult := wrapTaskResult(resp) - c.Assert(hasFalseResult, check.IsFalse) - c.Assert(result.Tasks, check.HasLen, 2) + require.False(t, hasFalseResult) + require.Len(t, result.Tasks, 2) if result.Tasks[0].TaskName == "test2" { result.Tasks[0], result.Tasks[1] = result.Tasks[1], result.Tasks[0] } @@ -154,18 +146,18 @@ func (t *testCtlMaster) TestWrapTaskResult(c *check.C) { Sources: []string{"mysql-replica-04"}, }, } - c.Assert(result.Tasks, check.DeepEquals, expectedResult) + require.Equal(t, expectedResult, result.Tasks) resp.Result = false _, hasFalseResult = wrapTaskResult(resp) - c.Assert(hasFalseResult, check.IsTrue) + require.True(t, hasFalseResult) resp.Result = true resp.Sources[0].Result = false _, hasFalseResult = wrapTaskResult(resp) - c.Assert(hasFalseResult, check.IsTrue) + require.True(t, hasFalseResult) resp.Sources[0].Result = true _, hasFalseResult = wrapTaskResult(resp) - c.Assert(hasFalseResult, check.IsFalse) + require.False(t, hasFalseResult) } diff --git a/dm/dumpling/dumpling_test.go b/dm/dumpling/dumpling_test.go index 52d40367d7..ed13e3ab49 100644 --- a/dm/dumpling/dumpling_test.go +++ b/dm/dumpling/dumpling_test.go @@ -20,7 +20,6 @@ import ( "github.com/DATA-DOG/go-sqlmock" "github.com/docker/go-units" - "github.com/pingcap/check" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/dumpling/export" "github.com/pingcap/tidb/pkg/util/filter" @@ -34,25 +33,25 @@ import ( "github.com/pingcap/tiflow/engine/pkg/promutil" "github.com/prometheus/client_golang/prometheus" "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" ) -var _ = check.Suite(&testDumplingSuite{}) - const ( testDumplingSchemaName = "INFORMATION_SCHEMA" testDumplingTableName = "TABLES" ) func TestSuite(t *testing.T) { - check.TestingT(t) + suite.Run(t, new(testDumplingSuite)) } type testDumplingSuite struct { + suite.Suite cfg *config.SubTaskConfig } -func (t *testDumplingSuite) SetUpSuite(c *check.C) { - dir := c.MkDir() +func (t *testDumplingSuite) SetupSuite() { + dir := t.T().TempDir() t.cfg = &config.SubTaskConfig{ Name: "dumpling_ut", Timezone: "UTC", @@ -68,68 +67,68 @@ func (t *testDumplingSuite) SetUpSuite(c *check.C) { }}, }, } - c.Assert(log.InitLogger(&log.Config{}), check.IsNil) + t.Require().NoError(log.InitLogger(&log.Config{})) } -func (t *testDumplingSuite) TestDumpling(c *check.C) { +func (t *testDumplingSuite) TestDumpling() { dumpling := NewDumpling(t.cfg) ctx, cancel := context.WithCancel(context.Background()) defer cancel() err := dumpling.Init(ctx) - c.Assert(err, check.IsNil) + t.Require().NoError(err) resultCh := make(chan pb.ProcessResult, 1) - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessNoError", `return(true)`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessNoError", `return(true)`)) //nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessNoError") dumpling.Process(ctx, resultCh) - c.Assert(len(resultCh), check.Equals, 1) + t.Require().Equal(1, len(resultCh)) result := <-resultCh - c.Assert(result.IsCanceled, check.IsFalse) - c.Assert(len(result.Errors), check.Equals, 0) + t.Require().False(result.IsCanceled) + t.Require().Equal(0, len(result.Errors)) //nolint:errcheck failpoint.Disable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessNoError") - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessWithError", `return("unknown error")`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessWithError", `return("unknown error")`)) // nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessWithError") // return error dumpling.Process(ctx, resultCh) - c.Assert(len(resultCh), check.Equals, 1) + t.Require().Equal(1, len(resultCh)) result = <-resultCh - c.Assert(result.IsCanceled, check.IsFalse) - c.Assert(len(result.Errors), check.Equals, 1) - c.Assert(result.Errors[0].Message, check.Equals, "unknown error") + t.Require().False(result.IsCanceled) + t.Require().Equal(1, len(result.Errors)) + t.Require().Equal("unknown error", result.Errors[0].Message) // nolint:errcheck failpoint.Disable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessWithError") // cancel - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessCancel", `return("unknown error")`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessCancel", `return("unknown error")`)) // nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessCancel") - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessForever", `return(true)`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessForever", `return(true)`)) //nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessForever") ctx2, cancel2 := context.WithTimeout(context.Background(), 3*time.Second) defer cancel2() dumpling.Process(ctx2, resultCh) - c.Assert(len(resultCh), check.Equals, 1) + t.Require().Equal(1, len(resultCh)) result = <-resultCh - c.Assert(result.IsCanceled, check.IsTrue) - c.Assert(len(result.Errors), check.Equals, 1) - c.Assert(result.Errors[0].String(), check.Matches, ".*context deadline exceeded.*") + t.Require().True(result.IsCanceled) + t.Require().Equal(1, len(result.Errors)) + t.Require().Regexp(".*context deadline exceeded.*", result.Errors[0].String()) } -func (t *testDumplingSuite) TestDefaultConfig(c *check.C) { +func (t *testDumplingSuite) TestDefaultConfig() { dumpling := NewDumpling(t.cfg) ctx := context.Background() - c.Assert(dumpling.Init(ctx), check.IsNil) - c.Assert(dumpling.dumpConfig.StatementSize, check.Not(check.Equals), export.UnspecifiedSize) - c.Assert(dumpling.dumpConfig.Rows, check.Not(check.Equals), export.UnspecifiedSize) + t.Require().NoError(dumpling.Init(ctx)) + t.Require().NotEqual(export.UnspecifiedSize, dumpling.dumpConfig.StatementSize) + t.Require().NotEqual(export.UnspecifiedSize, dumpling.dumpConfig.Rows) } func TestCallStatus(t *testing.T) { @@ -170,7 +169,7 @@ func TestCallStatus(t *testing.T) { require.Equal(t, s.Bps, int64(0)) } -func (t *testDumplingSuite) TestParseArgsWontOverwrite(c *check.C) { +func (t *testDumplingSuite) TestParseArgsWontOverwrite() { cfg := &config.SubTaskConfig{ Timezone: "UTC", } @@ -184,22 +183,22 @@ func (t *testDumplingSuite) TestParseArgsWontOverwrite(c *check.C) { d := NewDumpling(cfg) exportCfg, err := d.constructArgs(context.Background()) - c.Assert(err, check.IsNil) + t.Require().NoError(err) - c.Assert(exportCfg.StatementSize, check.Equals, uint64(4000)) - c.Assert(exportCfg.FileSize, check.Equals, uint64(1*units.MiB)) + t.Require().Equal(uint64(4000), exportCfg.StatementSize) + t.Require().Equal(uint64(1*units.MiB), exportCfg.FileSize) f, err2 := tfilter.ParseMySQLReplicationRules(rules) - c.Assert(err2, check.IsNil) - c.Assert(exportCfg.TableFilter, check.DeepEquals, tfilter.CaseInsensitive(f)) + t.Require().NoError(err2) + t.Require().Equal(tfilter.CaseInsensitive(f), exportCfg.TableFilter) - c.Assert(exportCfg.Consistency, check.Equals, "lock") + t.Require().Equal("lock", exportCfg.Consistency) } -func (t *testDumplingSuite) TestConstructArgs(c *check.C) { +func (t *testDumplingSuite) TestConstructArgs() { ctx := context.Background() - mock := conn.InitMockDB(c) + mock := conn.InitMockDB(t.T()) mock.ExpectQuery("SELECT cast\\(TIMEDIFF\\(NOW\\(6\\), UTC_TIMESTAMP\\(6\\)\\) as time\\);"). WillReturnRows(sqlmock.NewRows([]string{""}).AddRow("01:00:00")) @@ -207,13 +206,13 @@ func (t *testDumplingSuite) TestConstructArgs(c *check.C) { cfg.ExtraArgs = `--statement-size=100 --where "t>10" --threads 8 -F 50B` d := NewDumpling(cfg) exportCfg, err := d.constructArgs(ctx) - c.Assert(err, check.IsNil) - c.Assert(exportCfg.StatementSize, check.Equals, uint64(100)) - c.Assert(exportCfg.Where, check.Equals, "t>10") - c.Assert(exportCfg.Threads, check.Equals, 8) - c.Assert(exportCfg.FileSize, check.Equals, uint64(50)) - c.Assert(exportCfg.SessionParams, check.NotNil) - c.Assert(exportCfg.SessionParams["time_zone"], check.Equals, "+01:00") + t.Require().NoError(err) + t.Require().Equal(uint64(100), exportCfg.StatementSize) + t.Require().Equal("t>10", exportCfg.Where) + t.Require().Equal(8, exportCfg.Threads) + t.Require().Equal(uint64(50), exportCfg.FileSize) + t.Require().NotNil(exportCfg.SessionParams) + t.Require().Equal("+01:00", exportCfg.SessionParams["time_zone"]) } func genDumpCfg(t *testing.T) *config.SubTaskConfig { diff --git a/dm/loader/checkpoint_test.go b/dm/loader/checkpoint_test.go index 61d6a7758b..b2df6ec653 100644 --- a/dm/loader/checkpoint_test.go +++ b/dm/loader/checkpoint_test.go @@ -17,26 +17,30 @@ import ( "context" "database/sql" "fmt" + "testing" "github.com/DATA-DOG/go-sqlmock" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/config/dbconfig" "github.com/pingcap/tiflow/dm/pkg/conn" "github.com/pingcap/tiflow/dm/pkg/log" + "github.com/stretchr/testify/suite" ) -var _ = check.Suite(&lightningCpListSuite{}) - type lightningCpListSuite struct { + suite.Suite mock sqlmock.Sqlmock cpList *LightningCheckpointList } -func (s *lightningCpListSuite) SetUpTest(c *check.C) { - s.mock = conn.InitMockDB(c) +func TestLightningCpListSuite(t *testing.T) { + suite.Run(t, new(lightningCpListSuite)) +} + +func (s *lightningCpListSuite) SetupTest() { + s.mock = conn.InitMockDB(s.T()) baseDB, err := conn.GetDownstreamDB(&dbconfig.DBConfig{}) - c.Assert(err, check.IsNil) + s.Require().NoError(err) metaSchema := "dm_meta" cpList := NewLightningCheckpointList(baseDB, "test_lightning", "source1", metaSchema, log.L()) @@ -44,11 +48,11 @@ func (s *lightningCpListSuite) SetUpTest(c *check.C) { s.cpList = cpList } -func (s *lightningCpListSuite) TearDownTest(c *check.C) { - c.Assert(s.mock.ExpectationsWereMet(), check.IsNil) +func (s *lightningCpListSuite) TearDownTest() { + s.Require().NoError(s.mock.ExpectationsWereMet()) } -func (s *lightningCpListSuite) TestLightningCheckpointListPrepare(c *check.C) { +func (s *lightningCpListSuite) TestLightningCheckpointListPrepare() { ctx := context.Background() s.mock.ExpectBegin() s.mock.ExpectExec(fmt.Sprintf("CREATE SCHEMA IF NOT EXISTS %s.*", s.cpList.schema)).WillReturnResult(sqlmock.NewResult(1, 1)) @@ -57,44 +61,44 @@ func (s *lightningCpListSuite) TestLightningCheckpointListPrepare(c *check.C) { s.mock.ExpectExec(fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s.*", s.cpList.tableName)).WillReturnResult(sqlmock.NewResult(1, 1)) s.mock.ExpectCommit() err := s.cpList.Prepare(ctx) - c.Assert(err, check.IsNil) + s.Require().NoError(err) } -func (s *lightningCpListSuite) TestLightningCheckpointListStatusInit(c *check.C) { +func (s *lightningCpListSuite) TestLightningCheckpointListStatusInit() { // no rows in target table, will return default status s.mock.ExpectQuery(fmt.Sprintf("SELECT status FROM %s WHERE `task_name` = \\? AND `source_name` = \\?", s.cpList.tableName)). WithArgs(s.cpList.taskName, s.cpList.sourceName). WillReturnRows(sqlmock.NewRows([]string{"status"}).RowError(0, sql.ErrNoRows)) status, err := s.cpList.taskStatus(context.Background()) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, lightningStatusInit) + s.Require().NoError(err) + s.Require().Equal(lightningStatusInit, status) } -func (s *lightningCpListSuite) TestLightningCheckpointListStatusRunning(c *check.C) { +func (s *lightningCpListSuite) TestLightningCheckpointListStatusRunning() { s.mock.ExpectQuery(fmt.Sprintf("SELECT status FROM %s WHERE `task_name` = \\? AND `source_name` = \\?", s.cpList.tableName)). WithArgs(s.cpList.taskName, s.cpList.sourceName). WillReturnRows(sqlmock.NewRows([]string{"status"}).AddRow("running")) status, err := s.cpList.taskStatus(context.Background()) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, lightningStatusRunning) + s.Require().NoError(err) + s.Require().Equal(lightningStatusRunning, status) } -func (s *lightningCpListSuite) TestLightningCheckpointListRegister(c *check.C) { +func (s *lightningCpListSuite) TestLightningCheckpointListRegister() { s.mock.ExpectBegin() s.mock.ExpectExec(fmt.Sprintf("INSERT IGNORE INTO %s \\(`task_name`, `source_name`\\) VALUES \\(\\?, \\?\\)", s.cpList.tableName)). WithArgs(s.cpList.taskName, s.cpList.sourceName). WillReturnResult(sqlmock.NewResult(2, 1)) s.mock.ExpectCommit() err := s.cpList.RegisterCheckPoint(context.Background()) - c.Assert(err, check.IsNil) + s.Require().NoError(err) } -func (s *lightningCpListSuite) TestLightningCheckpointListUpdateStatus(c *check.C) { +func (s *lightningCpListSuite) TestLightningCheckpointListUpdateStatus() { s.mock.ExpectBegin() s.mock.ExpectExec(fmt.Sprintf("UPDATE %s set status = \\? WHERE `task_name` = \\? AND `source_name` = \\?", s.cpList.tableName)). WithArgs("running", s.cpList.taskName, s.cpList.sourceName). WillReturnResult(sqlmock.NewResult(3, 1)) s.mock.ExpectCommit() err := s.cpList.UpdateStatus(context.Background(), lightningStatusRunning) - c.Assert(err, check.IsNil) + s.Require().NoError(err) } diff --git a/dm/master/agent_pool_test.go b/dm/master/agent_pool_test.go index b4d1d2bb57..449d36da0c 100644 --- a/dm/master/agent_pool_test.go +++ b/dm/master/agent_pool_test.go @@ -16,16 +16,14 @@ package master import ( "context" "time" - - "github.com/pingcap/check" ) -func (t *testMaster) TestAgentPool(c *check.C) { - t.testPool(c) - t.testEmit(c) +func (t *testMaster) TestAgentPool() { + t.testPool() + t.testEmit() } -func (t *testMaster) testPool(c *check.C) { +func (t *testMaster) testPool() { var ( rate = 10 burst = 100 @@ -43,26 +41,26 @@ func (t *testMaster) testPool(c *check.C) { for i := 0; i < burst; i++ { agent := <-pc - c.Assert(agent.ID, check.Equals, i) + t.Require().Equal(i, agent.ID) } select { case <-pc: - c.Error("should not get agent now") + t.T().Error("should not get agent now") default: } for i := 0; i < rate; i++ { select { case agent := <-pc: - c.Assert(agent.ID, check.Equals, i+burst) + t.Require().Equal(i+burst, agent.ID) case <-time.After(time.Millisecond * 200): // add 100ms time drift here - c.Error("get agent timeout") + t.T().Error("get agent timeout") } } } -func (t *testMaster) testEmit(c *check.C) { +func (t *testMaster) testEmit() { type testWorkerType int var ( @@ -75,23 +73,23 @@ func (t *testMaster) testEmit(c *check.C) { ap.Emit(context.Background(), 1, func(args ...interface{}) { if len(args) != 2 { - c.Fatalf("args count is not 2, args %v", args) + t.T().Fatalf("args count is not 2, args %v", args) } id1, ok := args[0].(string) if !ok { - c.Fatalf("args[0] is not id, args %+v", args) + t.T().Fatalf("args[0] is not id, args %+v", args) } if id != id1 { - c.Fatalf("args[0] is expected id, args[0] %s vs %s", id1, id) + t.T().Fatalf("args[0] is expected id, args[0] %s vs %s", id1, id) } worker1, ok := args[1].(testWorkerType) if !ok { - c.Fatalf("args[1] is not worker client, args %+v", args) + t.T().Fatalf("args[1] is not worker client, args %+v", args) } if worker1 != worker { - c.Fatalf("args[1] is not expected worker, args[1] %v vs %v", worker1, worker) + t.T().Fatalf("args[1] is not expected worker, args[1] %v vs %v", worker1, worker) } }, func(args ...interface{}) {}, []interface{}{id, worker}...) @@ -99,16 +97,16 @@ func (t *testMaster) testEmit(c *check.C) { ctx, cancel := context.WithCancel(context.Background()) cancel() ap.Emit(ctx, 1, func(args ...interface{}) { - c.FailNow() + t.T().FailNow() }, func(args ...interface{}) { if len(args) != 1 { - c.Fatalf("args count is not 1, args %v", args) + t.T().Fatalf("args count is not 1, args %v", args) } pCounter, ok := args[0].(*int) if !ok { - c.Fatalf("args[0] is not *int, args %+v", args) + t.T().Fatalf("args[0] is not *int, args %+v", args) } *pCounter++ }, []interface{}{&counter}...) - c.Assert(counter, check.Equals, 1) + t.Require().Equal(1, counter) } diff --git a/dm/master/bootstrap_test.go b/dm/master/bootstrap_test.go index eedc1cfb4e..c9b0b740a8 100644 --- a/dm/master/bootstrap_test.go +++ b/dm/master/bootstrap_test.go @@ -23,7 +23,6 @@ import ( "time" "github.com/golang/mock/gomock" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/config" "github.com/pingcap/tiflow/dm/master/workerrpc" "github.com/pingcap/tiflow/dm/pb" @@ -33,41 +32,34 @@ import ( "github.com/pingcap/tiflow/dm/pkg/log" "github.com/pingcap/tiflow/dm/pkg/terror" filter "github.com/pingcap/tiflow/pkg/binlog-filter" + "github.com/stretchr/testify/suite" clientv3 "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/tests/v3/integration" ) type testMaster struct { + suite.Suite + workerClients map[string]workerrpc.Client saveMaxRetryNum int electionTTLBackup int - testT *testing.T testEtcdCluster *integration.ClusterV3 etcdTestCli *clientv3.Client } -var testSuite = check.SerialSuites(&testMaster{}) - func TestMaster(t *testing.T) { - err := log.InitLogger(&log.Config{}) - if err != nil { - t.Fatal(err) - } - pwd, err = os.Getwd() - if err != nil { - t.Fatal(err) - } - integration.BeforeTestExternal(t) - // inject *testing.T to testMaster - s := testSuite.(*testMaster) - s.testT = t - - check.TestingT(t) + suite.Run(t, new(testMaster)) + suite.Run(t, new(testEtcdSuite)) + suite.Run(t, new(testConfigSuite)) } -func (t *testMaster) SetUpSuite(c *check.C) { - c.Assert(log.InitLogger(&log.Config{}), check.IsNil) +func (t *testMaster) SetupSuite() { + t.Require().NoError(log.InitLogger(&log.Config{})) + var err error + pwd, err = os.Getwd() + t.Require().NoError(err) + integration.BeforeTestExternal(t.T()) t.workerClients = make(map[string]workerrpc.Client) t.saveMaxRetryNum = maxRetryNum t.electionTTLBackup = electionTTL @@ -76,43 +68,31 @@ func (t *testMaster) SetUpSuite(c *check.C) { checkAndAdjustSourceConfigForDMCtlFunc = checkAndNoAdjustSourceConfigMock } -func (t *testMaster) TearDownSuite(c *check.C) { +func (t *testMaster) TearDownSuite() { maxRetryNum = t.saveMaxRetryNum electionTTL = t.electionTTLBackup checkAndAdjustSourceConfigForDMCtlFunc = checkAndAdjustSourceConfig } -func (t *testMaster) SetUpTest(c *check.C) { - t.testEtcdCluster = integration.NewClusterV3(t.testT, &integration.ClusterConfig{Size: 1}) +func (t *testMaster) SetupTest() { + t.testEtcdCluster = integration.NewClusterV3(t.T(), &integration.ClusterConfig{Size: 1}) t.etcdTestCli = t.testEtcdCluster.RandClient() - t.clearEtcdEnv(c) + t.clearEtcdEnv() } -func (t *testMaster) TearDownTest(c *check.C) { - t.clearEtcdEnv(c) - t.testEtcdCluster.Terminate(t.testT) +func (t *testMaster) TearDownTest() { + t.clearEtcdEnv() + t.testEtcdCluster.Terminate(t.T()) } -func (t *testMaster) clearEtcdEnv(c *check.C) { - c.Assert(ha.ClearTestInfoOperation(t.etcdTestCli), check.IsNil) -} - -func testDefaultMasterServerWithC(c *check.C) *Server { - cfg := NewConfig() - err := cfg.FromContent(SampleConfig) - c.Assert(err, check.IsNil) - cfg.DataDir = c.MkDir() - server := NewServer(cfg) - server.leader.Store(oneselfLeader) - go server.ap.Start(context.Background()) - - return server +func (t *testMaster) clearEtcdEnv() { + t.Require().NoError(ha.ClearTestInfoOperation(t.etcdTestCli)) } -func (t *testMaster) TestCollectSourceConfigFilesV1Import(c *check.C) { - s := testDefaultMasterServerWithC(c) +func (t *testMaster) TestCollectSourceConfigFilesV1Import() { + s := testDefaultMasterServer(t.T()) defer s.Close() - s.cfg.V1SourcesPath = c.MkDir() + s.cfg.V1SourcesPath = t.T().TempDir() ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -121,8 +101,8 @@ func (t *testMaster) TestCollectSourceConfigFilesV1Import(c *check.C) { // no source file exist. cfgs, err := s.collectSourceConfigFilesV1Import(tctx) - c.Assert(err, check.IsNil) - c.Assert(cfgs, check.HasLen, 0) + t.Require().NoError(err) + t.Require().Len(cfgs, 0) host := os.Getenv("MYSQL_HOST") if host == "" { @@ -139,7 +119,7 @@ func (t *testMaster) TestCollectSourceConfigFilesV1Import(c *check.C) { password := os.Getenv("MYSQL_PSWD") cfg1, err := config.SourceCfgFromYaml(config.SampleSourceConfig) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // fix empty map after marshal/unmarshal becomes nil cfg1.From.Adjust() cfg1.Tracer = map[string]interface{}{} @@ -149,36 +129,36 @@ func (t *testMaster) TestCollectSourceConfigFilesV1Import(c *check.C) { cfg1.From.User = user cfg1.From.Password = password cfg1.RelayDir = "relay-dir" - c.Assert(checkAndAdjustSourceConfigForDMCtlFunc(ctx, cfg1), check.IsNil) // adjust source config. + t.Require().NoError(checkAndAdjustSourceConfigForDMCtlFunc(ctx, cfg1)) // adjust source config. cfg2 := cfg1.Clone() cfg2.SourceID = "mysql-replica-02" // write into source files. data1, err := cfg1.Yaml() - c.Assert(err, check.IsNil) - c.Assert(os.WriteFile(filepath.Join(s.cfg.V1SourcesPath, "source1.yaml"), []byte(data1), 0o644), check.IsNil) + t.Require().NoError(err) + t.Require().NoError(os.WriteFile(filepath.Join(s.cfg.V1SourcesPath, "source1.yaml"), []byte(data1), 0o644)) data2, err := cfg2.Yaml() - c.Assert(err, check.IsNil) - c.Assert(os.WriteFile(filepath.Join(s.cfg.V1SourcesPath, "source2.yaml"), []byte(data2), 0o644), check.IsNil) + t.Require().NoError(err) + t.Require().NoError(os.WriteFile(filepath.Join(s.cfg.V1SourcesPath, "source2.yaml"), []byte(data2), 0o644)) // collect again, two configs exist. cfgs, err = s.collectSourceConfigFilesV1Import(tctx) - c.Assert(err, check.IsNil) + t.Require().NoError(err) for _, cfg := range cfgs { cfg.From.Session = nil } - c.Assert(cfgs, check.HasLen, 2) - c.Assert(cfgs[cfg1.SourceID], check.DeepEquals, cfg1) - c.Assert(cfgs[cfg2.SourceID], check.DeepEquals, cfg2) + t.Require().Len(cfgs, 2) + t.Require().Equal(cfg1, cfgs[cfg1.SourceID]) + t.Require().Equal(cfg2, cfgs[cfg2.SourceID]) // put a invalid source file. - c.Assert(os.WriteFile(filepath.Join(s.cfg.V1SourcesPath, "invalid.yaml"), []byte("invalid-source-data"), 0o644), check.IsNil) + t.Require().NoError(os.WriteFile(filepath.Join(s.cfg.V1SourcesPath, "invalid.yaml"), []byte("invalid-source-data"), 0o644)) cfgs, err = s.collectSourceConfigFilesV1Import(tctx) - c.Assert(terror.ErrConfigYamlTransform.Equal(err), check.IsTrue) - c.Assert(cfgs, check.HasLen, 0) + t.Require().True(terror.ErrConfigYamlTransform.Equal(err)) + t.Require().Len(cfgs, 0) } -func (t *testMaster) TestWaitWorkersReadyV1Import(c *check.C) { +func (t *testMaster) TestWaitWorkersReadyV1Import() { oldWaitWorkerV1Timeout := waitWorkerV1Timeout defer func() { waitWorkerV1Timeout = oldWaitWorkerV1Timeout @@ -190,13 +170,13 @@ func (t *testMaster) TestWaitWorkersReadyV1Import(c *check.C) { tctx := tcontext.NewContext(ctx, log.L()) - s := testDefaultMasterServerWithC(c) + s := testDefaultMasterServer(t.T()) defer s.Close() - s.cfg.V1SourcesPath = c.MkDir() - c.Assert(s.scheduler.Start(ctx, t.etcdTestCli), check.IsNil) + s.cfg.V1SourcesPath = t.T().TempDir() + t.Require().NoError(s.scheduler.Start(ctx, t.etcdTestCli)) cfg1, err := config.SourceCfgFromYaml(config.SampleSourceConfig) - c.Assert(err, check.IsNil) + t.Require().NoError(err) cfg2 := cfg1.Clone() cfg2.SourceID = "mysql-replica-02" cfgs := map[string]*config.SourceConfig{ @@ -206,7 +186,8 @@ func (t *testMaster) TestWaitWorkersReadyV1Import(c *check.C) { // no worker registered, timeout. err = s.waitWorkersReadyV1Import(tctx, cfgs) - c.Assert(err, check.ErrorMatches, ".*wait for DM-worker instances timeout.*") + t.Require().Error(err) + t.Require().Regexp(".*wait for DM-worker instances timeout.*", err.Error()) // register one worker. req1 := &pb.RegisterWorkerRequest{ @@ -214,12 +195,13 @@ func (t *testMaster) TestWaitWorkersReadyV1Import(c *check.C) { Address: "127.0.0.1:8262", } resp1, err := s.RegisterWorker(ctx, req1) - c.Assert(err, check.IsNil) - c.Assert(resp1.Result, check.IsTrue) + t.Require().NoError(err) + t.Require().True(resp1.Result) // still timeout because no enough workers. err = s.waitWorkersReadyV1Import(tctx, cfgs) - c.Assert(err, check.ErrorMatches, ".*wait for DM-worker instances timeout.*") + t.Require().Error(err) + t.Require().Regexp(".*wait for DM-worker instances timeout.*", err.Error()) // register another worker. go func() { @@ -229,15 +211,15 @@ func (t *testMaster) TestWaitWorkersReadyV1Import(c *check.C) { Address: "127.0.0.1:8263", } resp2, err2 := s.RegisterWorker(ctx, req2) - c.Assert(err2, check.IsNil) - c.Assert(resp2.Result, check.IsTrue) + t.Require().NoError(err2) + t.Require().True(resp2.Result) }() err = s.waitWorkersReadyV1Import(tctx, cfgs) - c.Assert(err, check.IsNil) + t.Require().NoError(err) } -func (t *testMaster) TestSubtaskCfgsStagesV1Import(c *check.C) { +func (t *testMaster) TestSubtaskCfgsStagesV1Import() { var ( worker1Name = "worker-1" worker1Addr = "127.0.0.1:8262" @@ -250,60 +232,60 @@ func (t *testMaster) TestSubtaskCfgsStagesV1Import(c *check.C) { ) cfg11 := config.NewSubTaskConfig() - c.Assert(cfg11.Decode(config.SampleSubtaskConfig, true), check.IsNil) + t.Require().NoError(cfg11.Decode(config.SampleSubtaskConfig, true)) cfg11.Dir = "./dump_data" cfg11.ChunkFilesize = "64" cfg11.Name = taskName1 cfg11.SourceID = sourceID1 - c.Assert(cfg11.Adjust(true), check.IsNil) // adjust again after manually modified some items. + t.Require().NoError(cfg11.Adjust(true)) // adjust again after manually modified some items. data11, err := cfg11.Toml() - c.Assert(err, check.IsNil) + t.Require().NoError(err) data11 = strings.ReplaceAll(data11, `chunk-filesize = "64"`, `chunk-filesize = 64`) // different type between v1.0.x and v2.0.x. cfg12, err := cfg11.Clone() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cfg12.SourceID = sourceID2 data12, err := cfg12.Toml() - c.Assert(err, check.IsNil) + t.Require().NoError(err) data12 = strings.ReplaceAll(data12, `chunk-filesize = "64"`, `chunk-filesize = 64`) cfg21, err := cfg11.Clone() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cfg21.Dir = "./dump_data" cfg21.Name = taskName2 - c.Assert(cfg21.Adjust(true), check.IsNil) + t.Require().NoError(cfg21.Adjust(true)) data21, err := cfg21.Toml() - c.Assert(err, check.IsNil) + t.Require().NoError(err) data21 = strings.ReplaceAll(data21, `chunk-filesize = "64"`, `chunk-filesize = 64`) cfg22, err := cfg21.Clone() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cfg22.SourceID = sourceID2 data22, err := cfg22.Toml() - c.Assert(err, check.IsNil) + t.Require().NoError(err) data22 = strings.ReplaceAll(data22, `chunk-filesize = "64"`, `chunk-filesize = 64`) ctx, cancel := context.WithCancel(context.Background()) defer cancel() tctx := tcontext.NewContext(ctx, log.L()) - s := testDefaultMasterServerWithC(c) + s := testDefaultMasterServer(t.T()) defer s.Close() - s.cfg.V1SourcesPath = c.MkDir() - c.Assert(s.scheduler.Start(ctx, t.etcdTestCli), check.IsNil) + s.cfg.V1SourcesPath = t.T().TempDir() + t.Require().NoError(s.scheduler.Start(ctx, t.etcdTestCli)) // no workers exist, no config and status need to get. cfgs, stages, err := s.getSubtaskCfgsStagesV1Import(tctx) - c.Assert(err, check.IsNil) - c.Assert(cfgs, check.HasLen, 0) - c.Assert(stages, check.HasLen, 0) + t.Require().NoError(err) + t.Require().Len(cfgs, 0) + t.Require().Len(stages, 0) - ctrl := gomock.NewController(c) + ctrl := gomock.NewController(t.T()) defer ctrl.Finish() mockWCli1 := pbmock.NewMockWorkerClient(ctrl) mockWCli2 := pbmock.NewMockWorkerClient(ctrl) - c.Assert(s.scheduler.AddWorker(worker1Name, worker1Addr), check.IsNil) - c.Assert(s.scheduler.AddWorker(worker2Name, worker2Addr), check.IsNil) + t.Require().NoError(s.scheduler.AddWorker(worker1Name, worker1Addr)) + t.Require().NoError(s.scheduler.AddWorker(worker2Name, worker2Addr)) s.scheduler.SetWorkerClientForTest(worker1Name, newMockRPCClient(mockWCli1)) s.scheduler.SetWorkerClientForTest(worker2Name, newMockRPCClient(mockWCli2)) @@ -355,21 +337,21 @@ func (t *testMaster) TestSubtaskCfgsStagesV1Import(c *check.C) { // all workers return valid config and stage. cfgs, stages, err = s.getSubtaskCfgsStagesV1Import(tctx) - c.Assert(err, check.IsNil) - c.Assert(cfgs, check.HasLen, 2) - c.Assert(stages, check.HasLen, 2) - c.Assert(cfgs[taskName1], check.HasLen, 2) - c.Assert(cfgs[taskName2], check.HasLen, 2) - c.Assert(cfgs[taskName1][sourceID1], check.DeepEquals, *cfg11) - c.Assert(cfgs[taskName1][sourceID2], check.DeepEquals, *cfg12) - c.Assert(cfgs[taskName2][sourceID1], check.DeepEquals, *cfg21) - c.Assert(cfgs[taskName2][sourceID2], check.DeepEquals, *cfg22) - c.Assert(stages[taskName1], check.HasLen, 2) - c.Assert(stages[taskName2], check.HasLen, 2) - c.Assert(stages[taskName1][sourceID1], check.Equals, pb.Stage_Running) - c.Assert(stages[taskName1][sourceID2], check.Equals, pb.Stage_Running) - c.Assert(stages[taskName2][sourceID1], check.Equals, pb.Stage_Paused) - c.Assert(stages[taskName2][sourceID2], check.Equals, pb.Stage_Running) + t.Require().NoError(err) + t.Require().Len(cfgs, 2) + t.Require().Len(stages, 2) + t.Require().Len(cfgs[taskName1], 2) + t.Require().Len(cfgs[taskName2], 2) + t.Require().Equal(*cfg11, cfgs[taskName1][sourceID1]) + t.Require().Equal(*cfg12, cfgs[taskName1][sourceID2]) + t.Require().Equal(*cfg21, cfgs[taskName2][sourceID1]) + t.Require().Equal(*cfg22, cfgs[taskName2][sourceID2]) + t.Require().Len(stages[taskName1], 2) + t.Require().Len(stages[taskName2], 2) + t.Require().Equal(pb.Stage_Running, stages[taskName1][sourceID1]) + t.Require().Equal(pb.Stage_Running, stages[taskName1][sourceID2]) + t.Require().Equal(pb.Stage_Paused, stages[taskName2][sourceID1]) + t.Require().Equal(pb.Stage_Running, stages[taskName2][sourceID2]) // one of workers return invalid config. mockWCli1.EXPECT().OperateV1Meta( @@ -417,9 +399,10 @@ func (t *testMaster) TestSubtaskCfgsStagesV1Import(c *check.C) { }, }, nil) cfgs, stages, err = s.getSubtaskCfgsStagesV1Import(tctx) - c.Assert(err, check.ErrorMatches, ".*fail to get subtask config and stage.*") - c.Assert(cfgs, check.HasLen, 0) - c.Assert(stages, check.HasLen, 0) + t.Require().Error(err) + t.Require().Regexp(".*fail to get subtask config and stage.*", err.Error()) + t.Require().Len(cfgs, 0) + t.Require().Len(stages, 0) } func checkAndNoAdjustSourceConfigMock(ctx context.Context, cfg *config.SourceConfig) error { diff --git a/dm/master/config_test.go b/dm/master/config_test.go index b71587ad12..a4e475e117 100644 --- a/dm/master/config_test.go +++ b/dm/master/config_test.go @@ -26,33 +26,34 @@ import ( "testing" capturer "github.com/kami-zh/go-capturer" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/pkg/log" "github.com/pingcap/tiflow/dm/pkg/terror" "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "go.etcd.io/etcd/server/v3/embed" ) -var _ = check.Suite(&testConfigSuite{}) - -type testConfigSuite struct{} +type testConfigSuite struct { + suite.Suite +} -func (t *testConfigSuite) SetUpSuite(c *check.C) { +func (t *testConfigSuite) SetupSuite() { // initialized the logger to make genEmbedEtcdConfig working. - c.Assert(log.InitLogger(&log.Config{}), check.IsNil) + t.Require().NoError(log.InitLogger(&log.Config{})) } -func (t *testConfigSuite) TestPrintSampleConfig(c *check.C) { +func (t *testConfigSuite) TestPrintSampleConfig() { // test print sample config out := capturer.CaptureStdout(func() { cfg := NewConfig() err := cfg.Parse([]string{"-print-sample-config"}) - c.Assert(err, check.ErrorMatches, flag.ErrHelp.Error()) + t.Require().Error(err) + t.Require().Regexp(flag.ErrHelp.Error(), err.Error()) }) - c.Assert(strings.TrimSpace(out), check.Equals, strings.TrimSpace(SampleConfig)) + t.Require().Equal(strings.TrimSpace(SampleConfig), strings.TrimSpace(out)) } -func (t *testConfigSuite) TestConfig(c *check.C) { +func (t *testConfigSuite) TestConfig() { var ( err error cfg = &Config{} @@ -81,106 +82,110 @@ func (t *testConfigSuite) TestConfig(c *check.C) { ) err = cfg.FromContent(SampleConfig) - c.Assert(err, check.IsNil) + t.Require().NoError(err) err = cfg.Reload() - c.Assert(err, check.IsNil) - c.Assert(cfg.MasterAddr, check.Equals, masterAddr) + t.Require().NoError(err) + t.Require().Equal(masterAddr, cfg.MasterAddr) for _, tc := range cases { cfg = NewConfig() err = cfg.Parse(tc.args) if tc.hasError { - c.Assert(err, check.ErrorMatches, tc.errorReg) + t.Require().Error(err) + t.Require().Regexp(tc.errorReg, err.Error()) } } } -func (t *testConfigSuite) TestInvalidConfig(c *check.C) { +func (t *testConfigSuite) TestInvalidConfig() { var ( err error cfg = NewConfig() ) - filepath := path.Join(c.MkDir(), "test_invalid_config.toml") + filepath := path.Join(t.T().TempDir(), "test_invalid_config.toml") // field still remain undecoded in config will cause verify failed configContent := []byte(` master-addr = ":8261" advertise-addr = "127.0.0.1:8261" aaa = "xxx"`) err = os.WriteFile(filepath, configContent, 0o644) - c.Assert(err, check.IsNil) + t.Require().NoError(err) err = cfg.configFromFile(filepath) - c.Assert(err, check.NotNil) - c.Assert(err, check.ErrorMatches, "*master config contained unknown configuration options: aaa.*") + t.Require().Error(err) + t.Require().Regexp(".*master config contained unknown configuration options: aaa.*", err.Error()) // invalid `master-addr` - filepath2 := path.Join(c.MkDir(), "test_invalid_config.toml") + filepath2 := path.Join(t.T().TempDir(), "test_invalid_config.toml") configContent2 := []byte(`master-addr = ""`) err = os.WriteFile(filepath2, configContent2, 0o644) - c.Assert(err, check.IsNil) + t.Require().NoError(err) err = cfg.configFromFile(filepath2) - c.Assert(err, check.IsNil) - c.Assert(terror.ErrMasterHostPortNotValid.Equal(cfg.adjust()), check.IsTrue) + t.Require().NoError(err) + t.Require().True(terror.ErrMasterHostPortNotValid.Equal(cfg.adjust())) } -func (t *testConfigSuite) TestGenEmbedEtcdConfig(c *check.C) { +func (t *testConfigSuite) TestGenEmbedEtcdConfig() { hostname, err := os.Hostname() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cfg1 := NewConfig() cfg1.MasterAddr = ":8261" cfg1.AdvertiseAddr = "127.0.0.1:8261" cfg1.InitialClusterState = embed.ClusterStateFlagExisting - c.Assert(cfg1.adjust(), check.IsNil) + t.Require().NoError(cfg1.adjust()) etcdCfg, err := cfg1.genEmbedEtcdConfig(embed.NewConfig()) - c.Assert(err, check.IsNil) - c.Assert(etcdCfg.Name, check.Equals, fmt.Sprintf("dm-master-%s", hostname)) - c.Assert(etcdCfg.Dir, check.Equals, fmt.Sprintf("default.%s", etcdCfg.Name)) - c.Assert(etcdCfg.ListenClientUrls, check.DeepEquals, []url.URL{{Scheme: "http", Host: "0.0.0.0:8261"}}) - c.Assert(etcdCfg.AdvertiseClientUrls, check.DeepEquals, []url.URL{{Scheme: "http", Host: "127.0.0.1:8261"}}) - c.Assert(etcdCfg.ListenPeerUrls, check.DeepEquals, []url.URL{{Scheme: "http", Host: "127.0.0.1:8291"}}) - c.Assert(etcdCfg.AdvertisePeerUrls, check.DeepEquals, []url.URL{{Scheme: "http", Host: "127.0.0.1:8291"}}) - c.Assert(etcdCfg.InitialCluster, check.DeepEquals, fmt.Sprintf("dm-master-%s=http://127.0.0.1:8291", hostname)) - c.Assert(etcdCfg.ClusterState, check.Equals, embed.ClusterStateFlagExisting) - c.Assert(etcdCfg.AutoCompactionMode, check.Equals, "periodic") - c.Assert(etcdCfg.AutoCompactionRetention, check.Equals, "1h") - c.Assert(etcdCfg.QuotaBackendBytes, check.Equals, int64(2*1024*1024*1024)) + t.Require().NoError(err) + t.Require().Equal(fmt.Sprintf("dm-master-%s", hostname), etcdCfg.Name) + t.Require().Equal(fmt.Sprintf("default.%s", etcdCfg.Name), etcdCfg.Dir) + t.Require().Equal([]url.URL{{Scheme: "http", Host: "0.0.0.0:8261"}}, etcdCfg.ListenClientUrls) + t.Require().Equal([]url.URL{{Scheme: "http", Host: "127.0.0.1:8261"}}, etcdCfg.AdvertiseClientUrls) + t.Require().Equal([]url.URL{{Scheme: "http", Host: "127.0.0.1:8291"}}, etcdCfg.ListenPeerUrls) + t.Require().Equal([]url.URL{{Scheme: "http", Host: "127.0.0.1:8291"}}, etcdCfg.AdvertisePeerUrls) + t.Require().Equal(fmt.Sprintf("dm-master-%s=http://127.0.0.1:8291", hostname), etcdCfg.InitialCluster) + t.Require().Equal(embed.ClusterStateFlagExisting, etcdCfg.ClusterState) + t.Require().Equal("periodic", etcdCfg.AutoCompactionMode) + t.Require().Equal("1h", etcdCfg.AutoCompactionRetention) + t.Require().Equal(int64(2*1024*1024*1024), etcdCfg.QuotaBackendBytes) cfg2 := *cfg1 cfg2.MasterAddr = "127.0.0.1\n:8261" cfg2.AdvertiseAddr = "127.0.0.1:8261" _, err = cfg2.genEmbedEtcdConfig(embed.NewConfig()) - c.Assert(terror.ErrMasterGenEmbedEtcdConfigFail.Equal(err), check.IsTrue) - c.Assert(err, check.ErrorMatches, "(?m).*invalid master-addr.*") + t.Require().True(terror.ErrMasterGenEmbedEtcdConfigFail.Equal(err)) + t.Require().Error(err) + t.Require().Regexp("(?m).*invalid master-addr.*", err.Error()) cfg2.MasterAddr = "172.100.8.8:8261" cfg2.AdvertiseAddr = "172.100.8.8:8261" etcdCfg, err = cfg2.genEmbedEtcdConfig(embed.NewConfig()) - c.Assert(err, check.IsNil) - c.Assert(etcdCfg.ListenClientUrls, check.DeepEquals, []url.URL{{Scheme: "http", Host: "172.100.8.8:8261"}}) - c.Assert(etcdCfg.AdvertiseClientUrls, check.DeepEquals, []url.URL{{Scheme: "http", Host: "172.100.8.8:8261"}}) + t.Require().NoError(err) + t.Require().Equal([]url.URL{{Scheme: "http", Host: "172.100.8.8:8261"}}, etcdCfg.ListenClientUrls) + t.Require().Equal([]url.URL{{Scheme: "http", Host: "172.100.8.8:8261"}}, etcdCfg.AdvertiseClientUrls) cfg3 := *cfg1 cfg3.PeerUrls = "127.0.0.1:\n8291" _, err = cfg3.genEmbedEtcdConfig(embed.NewConfig()) - c.Assert(terror.ErrMasterGenEmbedEtcdConfigFail.Equal(err), check.IsTrue) - c.Assert(err, check.ErrorMatches, "(?m).*invalid peer-urls.*") + t.Require().True(terror.ErrMasterGenEmbedEtcdConfigFail.Equal(err)) + t.Require().Error(err) + t.Require().Regexp("(?m).*invalid peer-urls.*", err.Error()) cfg3.PeerUrls = "http://172.100.8.8:8291" etcdCfg, err = cfg3.genEmbedEtcdConfig(embed.NewConfig()) - c.Assert(err, check.IsNil) - c.Assert(etcdCfg.ListenPeerUrls, check.DeepEquals, []url.URL{{Scheme: "http", Host: "172.100.8.8:8291"}}) + t.Require().NoError(err) + t.Require().Equal([]url.URL{{Scheme: "http", Host: "172.100.8.8:8291"}}, etcdCfg.ListenPeerUrls) cfg4 := *cfg1 cfg4.AdvertisePeerUrls = "127.0.0.1:\n8291" _, err = cfg4.genEmbedEtcdConfig(embed.NewConfig()) - c.Assert(terror.ErrMasterGenEmbedEtcdConfigFail.Equal(err), check.IsTrue) - c.Assert(err, check.ErrorMatches, "(?m).*invalid advertise-peer-urls.*") + t.Require().True(terror.ErrMasterGenEmbedEtcdConfigFail.Equal(err)) + t.Require().Error(err) + t.Require().Regexp("(?m).*invalid advertise-peer-urls.*", err.Error()) cfg4.AdvertisePeerUrls = "http://172.100.8.8:8291" etcdCfg, err = cfg4.genEmbedEtcdConfig(embed.NewConfig()) - c.Assert(err, check.IsNil) - c.Assert(etcdCfg.AdvertisePeerUrls, check.DeepEquals, []url.URL{{Scheme: "http", Host: "172.100.8.8:8291"}}) + t.Require().NoError(err) + t.Require().Equal([]url.URL{{Scheme: "http", Host: "172.100.8.8:8291"}}, etcdCfg.AdvertisePeerUrls) } -func (t *testConfigSuite) TestParseURLs(c *check.C) { +func (t *testConfigSuite) TestParseURLs() { cases := []struct { str string urls []url.URL @@ -245,59 +250,59 @@ func (t *testConfigSuite) TestParseURLs(c *check.C) { } for _, cs := range cases { - c.Logf("raw string %s", cs.str) + t.T().Logf("raw string %s", cs.str) urls, err := parseURLs(cs.str) if cs.hasErr { - c.Assert(terror.ErrMasterParseURLFail.Equal(err), check.IsTrue) + t.Require().True(terror.ErrMasterParseURLFail.Equal(err)) } else { - c.Assert(err, check.IsNil) - c.Assert(urls, check.DeepEquals, cs.urls) + t.Require().NoError(err) + t.Require().Equal(cs.urls, urls) } } } -func (t *testConfigSuite) TestAdjustAddr(c *check.C) { +func (t *testConfigSuite) TestAdjustAddr() { cfg := NewConfig() - c.Assert(cfg.FromContent(SampleConfig), check.IsNil) - c.Assert(cfg.adjust(), check.IsNil) + t.Require().NoError(cfg.FromContent(SampleConfig)) + t.Require().NoError(cfg.adjust()) // invalid `advertise-addr` cfg.AdvertiseAddr = "127.0.0.1" - c.Assert(terror.ErrMasterAdvertiseAddrNotValid.Equal(cfg.adjust()), check.IsTrue) + t.Require().True(terror.ErrMasterAdvertiseAddrNotValid.Equal(cfg.adjust())) cfg.AdvertiseAddr = "0.0.0.0:8261" - c.Assert(terror.ErrMasterAdvertiseAddrNotValid.Equal(cfg.adjust()), check.IsTrue) + t.Require().True(terror.ErrMasterAdvertiseAddrNotValid.Equal(cfg.adjust())) // clear `advertise-addr`, still invalid because no `host` in `master-addr`. cfg.AdvertiseAddr = "" - c.Assert(terror.ErrMasterHostPortNotValid.Equal(cfg.adjust()), check.IsTrue) + t.Require().True(terror.ErrMasterHostPortNotValid.Equal(cfg.adjust())) cfg.MasterAddr = "127.0.0.1:8261" - c.Assert(cfg.adjust(), check.IsNil) - c.Assert(cfg.AdvertiseAddr, check.Equals, cfg.MasterAddr) + t.Require().NoError(cfg.adjust()) + t.Require().Equal(cfg.MasterAddr, cfg.AdvertiseAddr) } -func (t *testConfigSuite) TestAdjustOpenAPI(c *check.C) { +func (t *testConfigSuite) TestAdjustOpenAPI() { cfg := NewConfig() - c.Assert(cfg.FromContent(SampleConfig), check.IsNil) - c.Assert(cfg.adjust(), check.IsNil) + t.Require().NoError(cfg.FromContent(SampleConfig)) + t.Require().NoError(cfg.adjust()) // test default value - c.Assert(cfg.OpenAPI, check.Equals, false) - c.Assert(cfg.ExperimentalFeatures.OpenAPI, check.Equals, false) + t.Require().Equal(false, cfg.OpenAPI) + t.Require().Equal(false, cfg.ExperimentalFeatures.OpenAPI) // adjust openapi from experimental-features cfg.ExperimentalFeatures.OpenAPI = true - c.Assert(cfg.adjust(), check.IsNil) - c.Assert(cfg.OpenAPI, check.Equals, true) - c.Assert(cfg.ExperimentalFeatures.OpenAPI, check.Equals, false) + t.Require().NoError(cfg.adjust()) + t.Require().Equal(true, cfg.OpenAPI) + t.Require().Equal(false, cfg.ExperimentalFeatures.OpenAPI) // test from flags - c.Assert(cfg.Parse([]string{"--openapi=false", "--master-addr=127.0.0.1:8261"}), check.IsNil) - c.Assert(cfg.adjust(), check.IsNil) - c.Assert(cfg.OpenAPI, check.Equals, false) - c.Assert(cfg.Parse([]string{"--openapi=true", "--master-addr=127.0.0.1:8261"}), check.IsNil) - c.Assert(cfg.adjust(), check.IsNil) - c.Assert(cfg.OpenAPI, check.Equals, true) + t.Require().NoError(cfg.Parse([]string{"--openapi=false", "--master-addr=127.0.0.1:8261"})) + t.Require().NoError(cfg.adjust()) + t.Require().Equal(false, cfg.OpenAPI) + t.Require().NoError(cfg.Parse([]string{"--openapi=true", "--master-addr=127.0.0.1:8261"})) + t.Require().NoError(cfg.adjust()) + t.Require().Equal(true, cfg.OpenAPI) } func TestAdjustSecretKeyPath(t *testing.T) { diff --git a/dm/master/etcd_test.go b/dm/master/etcd_test.go index 2987612e33..6344ab6173 100644 --- a/dm/master/etcd_test.go +++ b/dm/master/etcd_test.go @@ -22,66 +22,66 @@ import ( "strings" "time" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/pkg/log" "github.com/pingcap/tiflow/dm/pkg/terror" "github.com/pingcap/tiflow/dm/pkg/utils" + "github.com/stretchr/testify/suite" "github.com/tikv/pd/pkg/utils/tempurl" clientv3 "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/server/v3/embed" ) -var _ = check.Suite(&testEtcdSuite{}) - -type testEtcdSuite struct{} +type testEtcdSuite struct { + suite.Suite +} -func (t *testEtcdSuite) SetUpSuite(c *check.C) { +func (t *testEtcdSuite) SetupSuite() { // initialized the logger to make genEmbedEtcdConfig working. - c.Assert(log.InitLogger(&log.Config{}), check.IsNil) + t.Require().NoError(log.InitLogger(&log.Config{})) } -func (t *testEtcdSuite) TestStartEtcdFail(c *check.C) { +func (t *testEtcdSuite) TestStartEtcdFail() { cfgCluster := NewConfig() cfgCluster.Name = "dm-master-1" - cfgCluster.DataDir = c.MkDir() + cfgCluster.DataDir = t.T().TempDir() cfgCluster.MasterAddr = tempurl.Alloc()[len("http://"):] cfgCluster.PeerUrls = tempurl.Alloc() - c.Assert(cfgCluster.adjust(), check.IsNil) + t.Require().NoError(cfgCluster.adjust()) // add another non-existing member for bootstrapping. cfgCluster.InitialCluster = fmt.Sprintf("%s=%s,%s=%s", cfgCluster.Name, cfgCluster.AdvertisePeerUrls, "dm-master-2", tempurl.Alloc()) - c.Assert(cfgCluster.adjust(), check.IsNil) + t.Require().NoError(cfgCluster.adjust()) // start an etcd cluster cfgClusterEtcd := genEmbedEtcdConfigWithLogger("info") cfgClusterEtcd, err := cfgCluster.genEmbedEtcdConfig(cfgClusterEtcd) - c.Assert(err, check.IsNil) + t.Require().NoError(err) e, err := startEtcd(cfgClusterEtcd, nil, nil, 3*time.Second) - c.Assert(terror.ErrMasterStartEmbedEtcdFail.Equal(err), check.IsTrue) - c.Assert(e, check.IsNil) + t.Require().True(terror.ErrMasterStartEmbedEtcdFail.Equal(err)) + t.Require().Nil(e) } -func (t *testEtcdSuite) TestPrepareJoinEtcd(c *check.C) { +func (t *testEtcdSuite) TestPrepareJoinEtcd() { cfgCluster := NewConfig() // used to start an etcd cluster cfgCluster.Name = "dm-master-1" - cfgCluster.DataDir = c.MkDir() + cfgCluster.DataDir = t.T().TempDir() cfgCluster.MasterAddr = tempurl.Alloc()[len("http://"):] cfgCluster.AdvertiseAddr = cfgCluster.MasterAddr cfgCluster.PeerUrls = tempurl.Alloc() - c.Assert(cfgCluster.adjust(), check.IsNil) + t.Require().NoError(cfgCluster.adjust()) cfgClusterEtcd := genEmbedEtcdConfigWithLogger("info") cfgClusterEtcd, err := cfgCluster.genEmbedEtcdConfig(cfgClusterEtcd) - c.Assert(err, check.IsNil) + t.Require().NoError(err) cfgBefore := t.cloneConfig(cfgCluster) // before `prepareJoinEtcd` applied - cfgBefore.DataDir = c.MkDir() // overwrite some config items + cfgBefore.DataDir = t.T().TempDir() // overwrite some config items cfgBefore.MasterAddr = tempurl.Alloc()[len("http://"):] cfgBefore.AdvertiseAddr = cfgBefore.MasterAddr cfgBefore.PeerUrls = tempurl.Alloc() cfgBefore.AdvertisePeerUrls = cfgBefore.PeerUrls - c.Assert(cfgBefore.adjust(), check.IsNil) + t.Require().NoError(cfgBefore.adjust()) cfgAfter := t.cloneConfig(cfgBefore) // after `prepareJoinEtcd applied @@ -90,54 +90,57 @@ func (t *testEtcdSuite) TestPrepareJoinEtcd(c *check.C) { memberDP := filepath.Join(cfgBefore.DataDir, "member") // not set `join`, do nothing - c.Assert(prepareJoinEtcd(cfgAfter), check.IsNil) - c.Assert(cfgAfter, check.DeepEquals, cfgBefore) + t.Require().NoError(prepareJoinEtcd(cfgAfter)) + t.Require().Equal(cfgBefore, cfgAfter) // try to join self cfgAfter.Join = cfgAfter.MasterAddr err = prepareJoinEtcd(cfgAfter) - c.Assert(terror.ErrMasterJoinEmbedEtcdFail.Equal(err), check.IsTrue) - c.Assert(err, check.ErrorMatches, ".*fail to join embed etcd: join self.*is forbidden.*") + t.Require().True(terror.ErrMasterJoinEmbedEtcdFail.Equal(err)) + t.Require().Error(err) + t.Require().Regexp(".*fail to join embed etcd: join self.*is forbidden.*", err.Error()) // update `join` to a valid item cfgBefore.Join = joinCluster // join with persistent data - c.Assert(os.WriteFile(joinFP, []byte(joinCluster), privateDirMode), check.IsNil) + t.Require().NoError(os.WriteFile(joinFP, []byte(joinCluster), privateDirMode)) cfgAfter = t.cloneConfig(cfgBefore) - c.Assert(prepareJoinEtcd(cfgAfter), check.IsNil) - c.Assert(cfgAfter.InitialCluster, check.Equals, joinCluster) - c.Assert(cfgAfter.InitialClusterState, check.Equals, embed.ClusterStateFlagExisting) - c.Assert(os.Remove(joinFP), check.IsNil) // remove the persistent data + t.Require().NoError(prepareJoinEtcd(cfgAfter)) + t.Require().Equal(joinCluster, cfgAfter.InitialCluster) + t.Require().Equal(embed.ClusterStateFlagExisting, cfgAfter.InitialClusterState) + t.Require().NoError(os.Remove(joinFP)) // remove the persistent data // join with invalid persistent data - c.Assert(os.Mkdir(joinFP, privateDirMode), check.IsNil) // use directory as invalid persistent data (file) + t.Require().NoError(os.Mkdir(joinFP, privateDirMode)) // use directory as invalid persistent data (file) cfgAfter = t.cloneConfig(cfgBefore) err = prepareJoinEtcd(cfgAfter) - c.Assert(terror.ErrMasterJoinEmbedEtcdFail.Equal(err), check.IsTrue) - c.Assert(err, check.ErrorMatches, ".*fail to join embed etcd: read persistent join data.*") - c.Assert(os.Remove(joinFP), check.IsNil) // remove the persistent data - c.Assert(cfgAfter, check.DeepEquals, cfgBefore) // not changed + t.Require().True(terror.ErrMasterJoinEmbedEtcdFail.Equal(err)) + t.Require().Error(err) + t.Require().Regexp(".*fail to join embed etcd: read persistent join data.*", err.Error()) + t.Require().NoError(os.Remove(joinFP)) // remove the persistent data + t.Require().Equal(cfgBefore, cfgAfter) // not changed // restart with previous data - c.Assert(os.Mkdir(memberDP, privateDirMode), check.IsNil) - c.Assert(os.Mkdir(filepath.Join(memberDP, "wal"), privateDirMode), check.IsNil) - c.Assert(prepareJoinEtcd(cfgAfter), check.IsNil) - c.Assert(cfgAfter.InitialCluster, check.Equals, "") - c.Assert(cfgAfter.InitialClusterState, check.Equals, embed.ClusterStateFlagExisting) - c.Assert(os.RemoveAll(memberDP), check.IsNil) // remove previous data + t.Require().NoError(os.Mkdir(memberDP, privateDirMode)) + t.Require().NoError(os.Mkdir(filepath.Join(memberDP, "wal"), privateDirMode)) + t.Require().NoError(prepareJoinEtcd(cfgAfter)) + t.Require().Equal("", cfgAfter.InitialCluster) + t.Require().Equal(embed.ClusterStateFlagExisting, cfgAfter.InitialClusterState) + t.Require().NoError(os.RemoveAll(memberDP)) // remove previous data // start an etcd cluster e1, err := startEtcd(cfgClusterEtcd, nil, nil, etcdStartTimeout) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer e1.Close() // same `name`, duplicate cfgAfter = t.cloneConfig(cfgBefore) err = prepareJoinEtcd(cfgAfter) - c.Assert(terror.ErrMasterJoinEmbedEtcdFail.Equal(err), check.IsTrue) - c.Assert(err, check.ErrorMatches, ".*fail to join embed etcd: missing data or joining a duplicate member.*") - c.Assert(cfgAfter, check.DeepEquals, cfgBefore) // not changed + t.Require().True(terror.ErrMasterJoinEmbedEtcdFail.Equal(err)) + t.Require().Error(err) + t.Require().Regexp(".*fail to join embed etcd: missing data or joining a duplicate member.*", err.Error()) + t.Require().Equal(cfgBefore, cfgAfter) // not changed // set a different name cfgBefore.Name = "dm-master-2" @@ -146,13 +149,14 @@ func (t *testEtcdSuite) TestPrepareJoinEtcd(c *check.C) { cfgAfter = t.cloneConfig(cfgBefore) cfgAfter.AdvertisePeerUrls = "invalid-advertise-peer-urls" err = prepareJoinEtcd(cfgAfter) - c.Assert(terror.ErrMasterJoinEmbedEtcdFail.Equal(err), check.IsTrue) - c.Assert(err, check.ErrorMatches, ".*fail to join embed etcd: add member.*") + t.Require().True(terror.ErrMasterJoinEmbedEtcdFail.Equal(err)) + t.Require().Error(err) + t.Require().Regexp(".*fail to join embed etcd: add member.*", err.Error()) // join with existing cluster cfgAfter = t.cloneConfig(cfgBefore) - c.Assert(prepareJoinEtcd(cfgAfter), check.IsNil) - c.Assert(cfgAfter.InitialClusterState, check.Equals, embed.ClusterStateFlagExisting) + t.Require().NoError(prepareJoinEtcd(cfgAfter)) + t.Require().Equal(embed.ClusterStateFlagExisting, cfgAfter.InitialClusterState) obtainClusters := strings.Split(cfgAfter.InitialCluster, ",") sort.Strings(obtainClusters) expectedClusters := []string{ @@ -160,31 +164,32 @@ func (t *testEtcdSuite) TestPrepareJoinEtcd(c *check.C) { fmt.Sprintf("%s=%s", cfgAfter.Name, cfgAfter.PeerUrls), } sort.Strings(expectedClusters) - c.Assert(obtainClusters, check.DeepEquals, expectedClusters) + t.Require().Equal(expectedClusters, obtainClusters) // join data should exist now joinData, err := os.ReadFile(joinFP) - c.Assert(err, check.IsNil) - c.Assert(string(joinData), check.Equals, cfgAfter.InitialCluster) + t.Require().NoError(err) + t.Require().Equal(cfgAfter.InitialCluster, string(joinData)) // prepare join done, but has not start the etcd to complete the join, can not join anymore. cfgAfter2 := t.cloneConfig(cfgBefore) cfgAfter2.Name = "dm-master-3" // overwrite some items - cfgAfter2.DataDir = c.MkDir() + cfgAfter2.DataDir = t.T().TempDir() cfgAfter2.MasterAddr = tempurl.Alloc()[len("http://"):] cfgAfter2.AdvertiseAddr = cfgAfter2.MasterAddr cfgAfter2.PeerUrls = tempurl.Alloc() cfgAfter2.AdvertisePeerUrls = cfgAfter2.PeerUrls err = prepareJoinEtcd(cfgAfter2) - c.Assert(terror.ErrMasterJoinEmbedEtcdFail.Equal(err), check.IsTrue) - c.Assert(err, check.ErrorMatches, ".*context deadline exceeded.*") + t.Require().True(terror.ErrMasterJoinEmbedEtcdFail.Equal(err)) + t.Require().Error(err) + t.Require().Regexp(".*context deadline exceeded.*", err.Error()) // start the joining etcd cfgAfterEtcd := genEmbedEtcdConfigWithLogger("info") cfgAfterEtcd, err = cfgAfter.genEmbedEtcdConfig(cfgAfterEtcd) - c.Assert(err, check.IsNil) + t.Require().NoError(err) e2, err := startEtcd(cfgAfterEtcd, nil, nil, etcdStartTimeout) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer e2.Close() // try join again @@ -194,11 +199,12 @@ func (t *testEtcdSuite) TestPrepareJoinEtcd(c *check.C) { break } // for `etcdserver: unhealthy cluster`, try again later - c.Assert(terror.ErrMasterJoinEmbedEtcdFail.Equal(err), check.IsTrue) - c.Assert(err, check.ErrorMatches, ".*fail to join embed etcd: add member.*: etcdserver: unhealthy cluster.*") + t.Require().True(terror.ErrMasterJoinEmbedEtcdFail.Equal(err)) + t.Require().Error(err) + t.Require().Regexp(".*fail to join embed etcd: add member.*: etcdserver: unhealthy cluster.*", err.Error()) time.Sleep(500 * time.Millisecond) } - c.Assert(err, check.IsNil) + t.Require().NoError(err) } func (t *testEtcdSuite) cloneConfig(cfg *Config) *Config { @@ -207,54 +213,55 @@ func (t *testEtcdSuite) cloneConfig(cfg *Config) *Config { return clone } -func (t *testEtcdSuite) TestIsDirExist(c *check.C) { +func (t *testEtcdSuite) TestIsDirExist() { d := "./directory-not-exists" - c.Assert(isDirExist(d), check.IsFalse) + t.Require().False(isDirExist(d)) // empty directory - d = c.MkDir() - c.Assert(isDirExist(d), check.IsTrue) + d = t.T().TempDir() + t.Require().True(isDirExist(d)) // data exists in the directory for i := 1; i <= 3; i++ { fp := filepath.Join(d, fmt.Sprintf("file.%d", i)) - c.Assert(os.WriteFile(fp, nil, privateDirMode), check.IsNil) - c.Assert(isDirExist(d), check.IsTrue) - c.Assert(isDirExist(fp), check.IsFalse) // not a directory + t.Require().NoError(os.WriteFile(fp, nil, privateDirMode)) + t.Require().True(isDirExist(d)) + t.Require().False(isDirExist(fp)) // not a directory } } -func (t *testEtcdSuite) TestEtcdAutoCompaction(c *check.C) { +func (t *testEtcdSuite) TestEtcdAutoCompaction() { cfg := NewConfig() - c.Assert(cfg.FromContent(SampleConfig), check.IsNil) + t.Require().NoError(cfg.FromContent(SampleConfig)) - cfg.DataDir = c.MkDir() + cfg.DataDir = t.T().TempDir() cfg.MasterAddr = tempurl.Alloc()[len("http://"):] cfg.AdvertiseAddr = cfg.MasterAddr cfg.AutoCompactionRetention = "1s" ctx, cancel := context.WithCancel(context.Background()) s := NewServer(cfg) - c.Assert(s.Start(ctx), check.IsNil) + t.Require().NoError(s.Start(ctx)) etcdCli, err := clientv3.New(clientv3.Config{ Endpoints: []string{cfg.MasterAddr}, }) - c.Assert(err, check.IsNil) + t.Require().NoError(err) for i := 0; i < 100; i++ { _, err = etcdCli.Put(ctx, "key", fmt.Sprintf("%03d", i)) - c.Assert(err, check.IsNil) + t.Require().NoError(err) } time.Sleep(3 * time.Second) resp, err := etcdCli.Get(ctx, "key") - c.Assert(err, check.IsNil) + t.Require().NoError(err) utils.WaitSomething(10, time.Second, func() bool { _, err = etcdCli.Get(ctx, "key", clientv3.WithRev(resp.Header.Revision-1)) return err != nil }) - c.Assert(err, check.ErrorMatches, ".*required revision has been compacted.*") + t.Require().Error(err) + t.Require().Regexp(".*required revision has been compacted.*", err.Error()) cancel() s.Close() diff --git a/dm/master/workerrpc/workerrpc_test.go b/dm/master/workerrpc/workerrpc_test.go index c4f60f86d8..441aa958cc 100644 --- a/dm/master/workerrpc/workerrpc_test.go +++ b/dm/master/workerrpc/workerrpc_test.go @@ -19,36 +19,28 @@ import ( "time" "github.com/golang/mock/gomock" - "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tiflow/dm/config/security" "github.com/pingcap/tiflow/dm/pb" "github.com/pingcap/tiflow/dm/pbmock" "github.com/pingcap/tiflow/dm/pkg/terror" + "github.com/stretchr/testify/require" "github.com/tikv/pd/pkg/utils/tempurl" ) -var _ = check.Suite(&testWorkerRPCSuite{}) - -type testWorkerRPCSuite struct{} - -func TestWorkerRPC(t *testing.T) { - check.TestingT(t) -} - -func (t *testWorkerRPCSuite) TestGRPCClient(c *check.C) { +func TestGRPCClient(t *testing.T) { timeout := 3 * time.Second ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - ctrl := gomock.NewController(c) + ctrl := gomock.NewController(t) defer ctrl.Finish() // get a random address for DM-worker addr := tempurl.Alloc()[len("http://"):] // NOTE: we don't wait for the gRPC connection establish now, in other words no need to wait for the DM-worker instance become online. rpcCli, err := NewGRPCClient(addr, security.Security{}) - c.Assert(err, check.IsNil) + require.NoError(t, err) // replace the underlying DM-worker client. workerCli := pbmock.NewMockWorkerClient(ctrl) @@ -91,25 +83,25 @@ OUTER: if req.Type == cmd { // supported cmd _, err = rpcCli.SendRequest(ctx, req, timeout) - c.Assert(err, check.IsNil) + require.NoError(t, err) continue OUTER } } _, err = rpcCli.SendRequest(ctx, &Request{Type: cmd}, timeout) - c.Assert(terror.ErrMasterGRPCInvalidReqType.Equal(err), check.IsTrue) + require.True(t, terror.ErrMasterGRPCInvalidReqType.Equal(err)) } // got an error from the underlying RPC. err2 := errors.New("mock error") workerCli.EXPECT().QueryStatus(gomock.Any(), reqs[0].QueryStatus).Return(nil, err2) _, err = rpcCli.SendRequest(ctx, reqs[0], timeout) - c.Assert(terror.ErrMasterGRPCRequestError.Equal(err), check.IsTrue) - c.Assert(errors.Cause(err), check.Equals, err2) + require.True(t, terror.ErrMasterGRPCRequestError.Equal(err)) + require.Equal(t, err2, errors.Cause(err)) // close the cli. - c.Assert(rpcCli.Close(), check.IsNil) + require.NoError(t, rpcCli.Close()) // can't send request any more. _, err = rpcCli.SendRequest(ctx, reqs[0], timeout) - c.Assert(terror.ErrMasterGRPCSendOnCloseConn.Equal(err), check.IsTrue) + require.True(t, terror.ErrMasterGRPCSendOnCloseConn.Equal(err)) } diff --git a/dm/openapi/logger_test.go b/dm/openapi/logger_test.go index 13adf646fc..d49970ea37 100644 --- a/dm/openapi/logger_test.go +++ b/dm/openapi/logger_test.go @@ -19,20 +19,12 @@ import ( "testing" "github.com/gin-gonic/gin" - "github.com/pingcap/check" + "github.com/stretchr/testify/require" "go.uber.org/zap" "go.uber.org/zap/zaptest/observer" ) -var _ = check.Suite(&zapLoggerSuite{}) - -type zapLoggerSuite struct{} - func TestZapLogger(t *testing.T) { - check.TestingT(t) -} - -func (t *zapLoggerSuite) TestZapLogger(c *check.C) { r := gin.New() obs, logs := observer.New(zap.DebugLevel) logger := zap.New(obs) @@ -46,14 +38,14 @@ func (t *zapLoggerSuite) TestZapLogger(c *check.C) { r.ServeHTTP(res, req) logFields := logs.All()[0].ContextMap() - c.Assert(logFields["method"], check.Equals, "GET") - c.Assert(logFields["request"], check.Equals, "GET /something") - c.Assert(logFields["status"], check.Equals, int64(200)) - c.Assert(logFields["duration"], check.NotNil) - c.Assert(logFields["host"], check.NotNil) - c.Assert(logFields["protocol"], check.NotNil) - c.Assert(logFields["remote_ip"], check.NotNil) - c.Assert(logFields["user_agent"], check.NotNil) - c.Assert(logFields["request"], check.NotNil) - c.Assert(logFields["error"], check.IsNil) + require.Equal(t, "GET", logFields["method"]) + require.Equal(t, "GET /something", logFields["request"]) + require.Equal(t, int64(200), logFields["status"]) + require.NotNil(t, logFields["duration"]) + require.NotNil(t, logFields["host"]) + require.NotNil(t, logFields["protocol"]) + require.NotNil(t, logFields["remote_ip"]) + require.NotNil(t, logFields["user_agent"]) + require.NotNil(t, logFields["request"]) + require.Nil(t, logFields["error"]) } diff --git a/dm/openapi/swaggerui_test.go b/dm/openapi/swaggerui_test.go index 3216312041..225ec858f2 100644 --- a/dm/openapi/swaggerui_test.go +++ b/dm/openapi/swaggerui_test.go @@ -17,19 +17,11 @@ import ( "strings" "testing" - "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&swaggerUISuite{}) - -type swaggerUISuite struct{} - -func TestNewSwaggerDocUI(t *testing.T) { - check.TestingT(t) -} - -func (t *swaggerUISuite) TestGetSwaggerHTML(c *check.C) { +func TestGetSwaggerHTML(t *testing.T) { html, err := GetSwaggerHTML(NewSwaggerConfig("/api/v1/docs/dm.json", "")) - c.Assert(err, check.IsNil) - c.Assert(strings.Contains(html, "API documentation"), check.Equals, true) + require.NoError(t, err) + require.Equal(t, true, strings.Contains(html, "API documentation")) } diff --git a/dm/openapi/task_test.go b/dm/openapi/task_test.go index 5b208e10bf..b0de3a2dca 100644 --- a/dm/openapi/task_test.go +++ b/dm/openapi/task_test.go @@ -16,26 +16,18 @@ package openapi import ( "testing" - "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&taskSuite{}) - -type taskSuite struct{} - -func TestTask(t *testing.T) { - check.TestingT(t) -} - -func (t *taskSuite) TestTaskAdjust(c *check.C) { +func TestTaskAdjust(t *testing.T) { meta := "test" // test no error task1 := &Task{MetaSchema: &meta, OnDuplicate: TaskOnDuplicateError} - c.Assert(task1.Adjust(), check.IsNil) - c.Assert(*task1.MetaSchema, check.Equals, meta) + require.NoError(t, task1.Adjust()) + require.Equal(t, meta, *task1.MetaSchema) // test default meta task3 := &Task{OnDuplicate: TaskOnDuplicateError} - c.Assert(task3.Adjust(), check.IsNil) - c.Assert(*task3.MetaSchema, check.Equals, defaultMetaSchema) + require.NoError(t, task3.Adjust()) + require.Equal(t, defaultMetaSchema, *task3.MetaSchema) } diff --git a/dm/pkg/checker/privilege_test.go b/dm/pkg/checker/privilege_test.go index 710059c09b..3858da85ff 100644 --- a/dm/pkg/checker/privilege_test.go +++ b/dm/pkg/checker/privilege_test.go @@ -16,20 +16,11 @@ package checker import ( "testing" - tc "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/util/filter" "github.com/stretchr/testify/require" ) -func TestClient(t *testing.T) { - tc.TestingT(t) -} - -var _ = tc.Suite(&testCheckSuite{}) - -type testCheckSuite struct{} - func TestVerifyDumpPrivileges(t *testing.T) { cases := []struct { grants []string diff --git a/dm/pkg/conn/mockdb.go b/dm/pkg/conn/mockdb.go index 1288e8e1c7..0d6f017d51 100644 --- a/dm/pkg/conn/mockdb.go +++ b/dm/pkg/conn/mockdb.go @@ -22,7 +22,6 @@ import ( "time" "github.com/DATA-DOG/go-sqlmock" - check "github.com/pingcap/check" tidbConfig "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/domain" "github.com/pingcap/tidb/pkg/kv" @@ -30,6 +29,7 @@ import ( "github.com/pingcap/tidb/pkg/session" "github.com/pingcap/tidb/pkg/sessionctx/vardef" "github.com/pingcap/tidb/pkg/store/mockstore" + "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/testutils" ) @@ -59,9 +59,9 @@ func (d *mockDBProvider) Apply(config ScopedDBConfig) (*BaseDB, error) { } // InitMockDB return a mocked db for unit test. -func InitMockDB(c *check.C) sqlmock.Sqlmock { +func InitMockDB(t require.TestingT) sqlmock.Sqlmock { db, mock, err := sqlmock.New() - c.Assert(err, check.IsNil) + require.NoError(t, err) if mdbp, ok := DefaultDBProvider.(*mockDBProvider); ok { mdbp.db = db } else { diff --git a/dm/pkg/election/election_test.go b/dm/pkg/election/election_test.go index 8934a558d8..c79c891fd4 100644 --- a/dm/pkg/election/election_test.go +++ b/dm/pkg/election/election_test.go @@ -21,49 +21,49 @@ import ( "testing" "time" - "github.com/pingcap/check" "github.com/pingcap/failpoint" "github.com/pingcap/tiflow/dm/pkg/etcdutil" "github.com/pingcap/tiflow/dm/pkg/log" "github.com/pingcap/tiflow/dm/pkg/terror" "github.com/pingcap/tiflow/dm/pkg/utils" + "github.com/stretchr/testify/suite" "github.com/tikv/pd/pkg/utils/tempurl" clientv3 "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/server/v3/embed" ) -var _ = check.SerialSuites(&testElectionSuite{}) - func TestSuite(t *testing.T) { - check.TestingT(t) + suite.Run(t, new(testElectionSuite)) } type testElectionSuite struct { + suite.Suite + etcd *embed.Etcd endPoint string notifyBlockTime time.Duration } -func (t *testElectionSuite) SetUpTest(c *check.C) { - c.Assert(log.InitLogger(&log.Config{}), check.IsNil) +func (t *testElectionSuite) SetupTest() { + t.Require().NoError(log.InitLogger(&log.Config{})) cfg := embed.NewConfig() cfg.Name = "election-test" - cfg.Dir = c.MkDir() + cfg.Dir = t.T().TempDir() cfg.ZapLoggerBuilder = embed.NewZapCoreLoggerBuilder(log.L().Logger, log.L().Core(), log.Props().Syncer) cfg.Logger = "zap" err := cfg.Validate() // verify & trigger the builder - c.Assert(err, check.IsNil) + t.Require().NoError(err) t.endPoint = tempurl.Alloc() url2, err := url.Parse(t.endPoint) - c.Assert(err, check.IsNil) + t.Require().NoError(err) cfg.ListenClientUrls = []url.URL{*url2} cfg.AdvertiseClientUrls = cfg.ListenClientUrls url2, err = url.Parse(tempurl.Alloc()) - c.Assert(err, check.IsNil) + t.Require().NoError(err) cfg.ListenPeerUrls = []url.URL{*url2} cfg.AdvertisePeerUrls = cfg.ListenPeerUrls @@ -71,22 +71,22 @@ func (t *testElectionSuite) SetUpTest(c *check.C) { cfg.ClusterState = embed.ClusterStateFlagNew t.etcd, err = embed.StartEtcd(cfg) - c.Assert(err, check.IsNil) + t.Require().NoError(err) select { case <-t.etcd.Server.ReadyNotify(): case <-time.After(10 * time.Second): - c.Fatal("start embed etcd timeout") + t.T().Fatal("start embed etcd timeout") } // some notify leader information is not handled, just reduce the block time and ignore them t.notifyBlockTime = 100 * time.Millisecond } -func (t *testElectionSuite) TearDownTest(c *check.C) { +func (t *testElectionSuite) TearDownTest() { t.etcd.Close() } -func testElection2After1(t *testElectionSuite, c *check.C, normalExit bool) { +func (t *testElectionSuite) testElection2After1(normalExit bool) { var ( timeout = 3 * time.Second sessionTTL = 60 @@ -99,94 +99,94 @@ func testElection2After1(t *testElectionSuite, c *check.C, normalExit bool) { addr3 = "127.0.0.1:3" ) cli, err := etcdutil.CreateClient([]string{t.endPoint}, nil) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer cli.Close() ctx0, cancel0 := context.WithCancel(context.Background()) defer cancel0() _, err = cli.Delete(ctx0, key, clientv3.WithPrefix()) - c.Assert(err, check.IsNil) + t.Require().NoError(err) ctx1, cancel1 := context.WithCancel(context.Background()) defer cancel1() if !normalExit { - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/election/mockCampaignLoopExitedAbnormally", `return()`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/election/mockCampaignLoopExitedAbnormally", `return()`)) //nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/pkg/election/mockCampaignLoopExitedAbnormally") } e1, err := NewElection(ctx1, cli, sessionTTL, key, ID1, addr1, t.notifyBlockTime) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer e1.Close() // e1 should become the leader select { case leader := <-e1.LeaderNotify(): - c.Assert(leader.ID, check.Equals, ID1) + t.Require().Equal(ID1, leader.ID) case <-time.After(timeout): - c.Fatal("leader campaign timeout") + t.T().Fatal("leader campaign timeout") } - c.Assert(e1.IsLeader(), check.IsTrue) + t.Require().True(e1.IsLeader()) _, leaderID, leaderAddr, err := e1.LeaderInfo(ctx1) - c.Assert(err, check.IsNil) - c.Assert(leaderID, check.Equals, e1.ID()) - c.Assert(leaderAddr, check.Equals, addr1) + t.Require().NoError(err) + t.Require().Equal(e1.ID(), leaderID) + t.Require().Equal(addr1, leaderAddr) if !normalExit { - c.Assert(failpoint.Disable("github.com/pingcap/tiflow/dm/pkg/election/mockCampaignLoopExitedAbnormally"), check.IsNil) + t.Require().NoError(failpoint.Disable("github.com/pingcap/tiflow/dm/pkg/election/mockCampaignLoopExitedAbnormally")) } // start e2 ctx2, cancel2 := context.WithCancel(context.Background()) defer cancel2() e2, err := NewElection(ctx2, cli, sessionTTL, key, ID2, addr2, t.notifyBlockTime) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer e2.Close() select { case leader := <-e2.leaderCh: - c.Assert(leader.ID, check.Equals, ID1) + t.Require().Equal(ID1, leader.ID) case <-time.After(timeout): - c.Fatal("leader campaign timeout") + t.T().Fatal("leader campaign timeout") } // but the leader should still be e1 _, leaderID, leaderAddr, err = e2.LeaderInfo(ctx2) - c.Assert(err, check.IsNil) - c.Assert(leaderID, check.Equals, e1.ID()) - c.Assert(leaderAddr, check.Equals, addr1) - c.Assert(e2.IsLeader(), check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(e1.ID(), leaderID) + t.Require().Equal(addr1, leaderAddr) + t.Require().False(e2.IsLeader()) var wg sync.WaitGroup e1.Close() // stop the campaign for e1 - c.Assert(e1.IsLeader(), check.IsFalse) + t.Require().False(e1.IsLeader()) ctx3, cancel3 := context.WithTimeout(context.Background(), 3*time.Second) defer cancel3() deleted, err := e2.ClearSessionIfNeeded(ctx3, ID1) - c.Assert(err, check.IsNil) + t.Require().NoError(err) if normalExit { // for normally exited election, session has already been closed before - c.Assert(deleted, check.IsFalse) + t.Require().False(deleted) } else { // for abnormally exited election, session will be cleared here - c.Assert(deleted, check.IsTrue) + t.Require().True(deleted) } // e2 should become the leader select { case leader := <-e2.LeaderNotify(): - c.Assert(leader.ID, check.Equals, ID2) + t.Require().Equal(ID2, leader.ID) case <-time.After(timeout): - c.Fatal("leader campaign timeout") + t.T().Fatal("leader campaign timeout") } - c.Assert(e2.IsLeader(), check.IsTrue) + t.Require().True(e2.IsLeader()) _, leaderID, leaderAddr, err = e2.LeaderInfo(ctx2) - c.Assert(err, check.IsNil) - c.Assert(leaderID, check.Equals, e2.ID()) - c.Assert(leaderAddr, check.Equals, addr2) + t.Require().NoError(err) + t.Require().Equal(e2.ID(), leaderID) + t.Require().Equal(addr2, leaderAddr) // only e2's election info is left in etcd ctx4, cancel4 := context.WithTimeout(context.Background(), 3*time.Second) defer cancel4() resp, err := cli.Get(ctx4, key, clientv3.WithPrefix()) - c.Assert(err, check.IsNil) - c.Assert(resp.Kvs, check.HasLen, 1) + t.Require().NoError(err) + t.Require().Len(resp.Kvs, 1) // if closing the client when campaigning, we should get an error wg.Add(1) @@ -194,11 +194,12 @@ func testElection2After1(t *testElectionSuite, c *check.C, normalExit bool) { defer wg.Done() select { case err2 := <-e2.ErrorNotify(): - c.Assert(terror.ErrElectionCampaignFail.Equal(err2), check.IsTrue) + t.Require().True(terror.ErrElectionCampaignFail.Equal(err2)) // the old session is done, but we can't create a new one. - c.Assert(err2, check.ErrorMatches, ".*fail to campaign leader: create a new session.*") + t.Require().Error(err2) + t.Require().Regexp(".*fail to campaign leader: create a new session.*", err2.Error()) case <-time.After(timeout): - c.Fatal("do not receive error for e2") + t.T().Fatal("do not receive error for e2") } }() cli.Close() // close the client @@ -208,17 +209,18 @@ func testElection2After1(t *testElectionSuite, c *check.C, normalExit bool) { ctx5, cancel5 := context.WithCancel(context.Background()) defer cancel5() _, err = NewElection(ctx5, cli, sessionTTL, key, ID3, addr3, t.notifyBlockTime) - c.Assert(terror.ErrElectionCampaignFail.Equal(err), check.IsTrue) - c.Assert(err, check.ErrorMatches, ".*Message: fail to campaign leader: create the initial session, RawCause: context canceled.*") + t.Require().True(terror.ErrElectionCampaignFail.Equal(err)) + t.Require().Error(err) + t.Require().Regexp(".*Message: fail to campaign leader: create the initial session, RawCause: context canceled.*", err.Error()) cancel0() } -func (t *testElectionSuite) TestElection2After1(c *check.C) { - testElection2After1(t, c, true) - testElection2After1(t, c, false) +func (t *testElectionSuite) TestElection2After1() { + t.testElection2After1(true) + t.testElection2After1(false) } -func (t *testElectionSuite) TestElectionAlways1(c *check.C) { +func (t *testElectionSuite) TestElectionAlways1() { var ( timeout = 3 * time.Second sessionTTL = 60 @@ -229,41 +231,41 @@ func (t *testElectionSuite) TestElectionAlways1(c *check.C) { addr2 = "127.0.0.1:2345" ) cli, err := etcdutil.CreateClient([]string{t.endPoint}, nil) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer cli.Close() ctx1, cancel1 := context.WithCancel(context.Background()) defer cancel1() e1, err := NewElection(ctx1, cli, sessionTTL, key, ID1, addr1, t.notifyBlockTime) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer e1.Close() // e1 should become the leader select { case leader := <-e1.LeaderNotify(): - c.Assert(leader.ID, check.Equals, ID1) + t.Require().Equal(ID1, leader.ID) case <-time.After(timeout): - c.Fatal("leader campaign timeout") + t.T().Fatal("leader campaign timeout") } - c.Assert(e1.IsLeader(), check.IsTrue) + t.Require().True(e1.IsLeader()) _, leaderID, leaderAddr, err := e1.LeaderInfo(ctx1) - c.Assert(err, check.IsNil) - c.Assert(leaderID, check.Equals, e1.ID()) - c.Assert(leaderAddr, check.Equals, addr1) + t.Require().NoError(err) + t.Require().Equal(e1.ID(), leaderID) + t.Require().Equal(addr1, leaderAddr) // start e2 ctx2, cancel2 := context.WithCancel(context.Background()) defer cancel2() e2, err := NewElection(ctx2, cli, sessionTTL, key, ID2, addr2, t.notifyBlockTime) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer e2.Close() time.Sleep(100 * time.Millisecond) // wait 100ms to start the campaign // but the leader should still be e1 _, leaderID, leaderAddr, err = e2.LeaderInfo(ctx2) - c.Assert(err, check.IsNil) - c.Assert(leaderID, check.Equals, e1.ID()) - c.Assert(leaderAddr, check.Equals, addr1) - c.Assert(e2.IsLeader(), check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(e1.ID(), leaderID) + t.Require().Equal(addr1, leaderAddr) + t.Require().False(e2.IsLeader()) // cancel the campaign for e2, should get no errors var wg sync.WaitGroup @@ -272,7 +274,7 @@ func (t *testElectionSuite) TestElectionAlways1(c *check.C) { defer wg.Done() select { case err2 := <-e2.ErrorNotify(): - c.Fatalf("cancel the campaign should not get an error, %v", err2) + t.T().Fatalf("cancel the campaign should not get an error, %v", err2) case <-time.After(timeout): // wait 3s } }() @@ -280,15 +282,15 @@ func (t *testElectionSuite) TestElectionAlways1(c *check.C) { wg.Wait() // e1 is still the leader - c.Assert(e1.IsLeader(), check.IsTrue) + t.Require().True(e1.IsLeader()) _, leaderID, leaderAddr, err = e1.LeaderInfo(ctx1) - c.Assert(err, check.IsNil) - c.Assert(leaderID, check.Equals, e1.ID()) - c.Assert(leaderAddr, check.Equals, addr1) - c.Assert(e2.IsLeader(), check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(e1.ID(), leaderID) + t.Require().Equal(addr1, leaderAddr) + t.Require().False(e2.IsLeader()) } -func (t *testElectionSuite) TestElectionEvictLeader(c *check.C) { +func (t *testElectionSuite) TestElectionEvictLeader() { var ( timeout = 3 * time.Second sessionTTL = 60 @@ -299,41 +301,41 @@ func (t *testElectionSuite) TestElectionEvictLeader(c *check.C) { addr2 = "127.0.0.1:2345" ) cli, err := etcdutil.CreateClient([]string{t.endPoint}, nil) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer cli.Close() ctx1, cancel1 := context.WithCancel(context.Background()) defer cancel1() e1, err := NewElection(ctx1, cli, sessionTTL, key, ID1, addr1, t.notifyBlockTime) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer e1.Close() // e1 should become the leader select { case leader := <-e1.LeaderNotify(): - c.Assert(leader.ID, check.Equals, ID1) + t.Require().Equal(ID1, leader.ID) case <-time.After(timeout): - c.Fatal("leader campaign timeout") + t.T().Fatal("leader campaign timeout") } - c.Assert(e1.IsLeader(), check.IsTrue) + t.Require().True(e1.IsLeader()) _, leaderID, leaderAddr, err := e1.LeaderInfo(ctx1) - c.Assert(err, check.IsNil) - c.Assert(leaderID, check.Equals, e1.ID()) - c.Assert(leaderAddr, check.Equals, addr1) + t.Require().NoError(err) + t.Require().Equal(e1.ID(), leaderID) + t.Require().Equal(addr1, leaderAddr) // start e2 ctx2, cancel2 := context.WithCancel(context.Background()) defer cancel2() e2, err := NewElection(ctx2, cli, sessionTTL, key, ID2, addr2, t.notifyBlockTime) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer e2.Close() time.Sleep(100 * time.Millisecond) // wait 100ms to start the campaign // but the leader should still be e1 _, leaderID, leaderAddr, err = e2.LeaderInfo(ctx2) - c.Assert(err, check.IsNil) - c.Assert(leaderID, check.Equals, e1.ID()) - c.Assert(leaderAddr, check.Equals, addr1) - c.Assert(e2.IsLeader(), check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(e1.ID(), leaderID) + t.Require().Equal(addr1, leaderAddr) + t.Require().False(e2.IsLeader()) // e1 evict leader, and e2 will be the leader e1.EvictLeader() @@ -342,9 +344,9 @@ func (t *testElectionSuite) TestElectionEvictLeader(c *check.C) { return leaderID == e2.ID() }) _, leaderID, leaderAddr, err = e2.LeaderInfo(ctx2) - c.Assert(err, check.IsNil) - c.Assert(leaderID, check.Equals, e2.ID()) - c.Assert(leaderAddr, check.Equals, addr2) + t.Require().NoError(err) + t.Require().Equal(e2.ID(), leaderID) + t.Require().Equal(addr2, leaderAddr) utils.WaitSomething(10, 10*time.Millisecond, func() bool { return e2.IsLeader() }) @@ -357,15 +359,15 @@ func (t *testElectionSuite) TestElectionEvictLeader(c *check.C) { return leaderID == e1.ID() }) _, leaderID, leaderAddr, err = e1.LeaderInfo(ctx1) - c.Assert(err, check.IsNil) - c.Assert(leaderID, check.Equals, e1.ID()) - c.Assert(leaderAddr, check.Equals, addr1) + t.Require().NoError(err) + t.Require().Equal(e1.ID(), leaderID) + t.Require().Equal(addr1, leaderAddr) utils.WaitSomething(10, 10*time.Millisecond, func() bool { return e1.IsLeader() }) } -func (t *testElectionSuite) TestElectionDeleteKey(c *check.C) { +func (t *testElectionSuite) TestElectionDeleteKey() { var ( timeout = 3 * time.Second sessionTTL = 60 @@ -374,27 +376,27 @@ func (t *testElectionSuite) TestElectionDeleteKey(c *check.C) { addr = "127.0.0.1:1234" ) cli, err := etcdutil.CreateClient([]string{t.endPoint}, nil) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer cli.Close() ctx, cancel := context.WithCancel(context.Background()) defer cancel() e, err := NewElection(ctx, cli, sessionTTL, key, ID, addr, t.notifyBlockTime) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer e.Close() // should become the leader select { case leader := <-e.LeaderNotify(): - c.Assert(leader.ID, check.Equals, ID) + t.Require().Equal(ID, leader.ID) case <-time.After(timeout): - c.Fatal("leader campaign timeout") + t.T().Fatal("leader campaign timeout") } - c.Assert(e.IsLeader(), check.IsTrue) + t.Require().True(e.IsLeader()) leaderKey, leaderID, leaderAddr, err := e.LeaderInfo(ctx) - c.Assert(err, check.IsNil) - c.Assert(leaderID, check.Equals, e.ID()) - c.Assert(leaderAddr, check.Equals, addr) + t.Require().NoError(err) + t.Require().Equal(e.ID(), leaderID) + t.Require().Equal(addr, leaderAddr) // the leader retired after deleted the key var wg sync.WaitGroup @@ -403,17 +405,17 @@ func (t *testElectionSuite) TestElectionDeleteKey(c *check.C) { wg.Done() select { case err2 := <-e.ErrorNotify(): - c.Fatalf("delete the leader key should not get an error, %v", err2) + t.T().Fatalf("delete the leader key should not get an error, %v", err2) case leader := <-e.LeaderNotify(): - c.Assert(leader, check.IsNil) + t.Require().Nil(leader) } }() _, err = cli.Delete(ctx, leaderKey) - c.Assert(err, check.IsNil) + t.Require().NoError(err) wg.Wait() } -func (t *testElectionSuite) TestElectionSucceedButReturnError(c *check.C) { +func (t *testElectionSuite) TestElectionSucceedButReturnError() { var ( timeout = 5 * time.Second sessionTTL = 60 @@ -424,70 +426,70 @@ func (t *testElectionSuite) TestElectionSucceedButReturnError(c *check.C) { addr2 = "127.0.0.1:2" ) cli, err := etcdutil.CreateClient([]string{t.endPoint}, nil) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer cli.Close() ctx1, cancel1 := context.WithCancel(context.Background()) defer cancel1() e1, err := NewElection(ctx1, cli, sessionTTL, key, ID1, addr1, t.notifyBlockTime) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer e1.Close() // e1 should become the leader select { case leader := <-e1.LeaderNotify(): - c.Assert(leader.ID, check.Equals, ID1) + t.Require().Equal(ID1, leader.ID) case <-time.After(timeout): - c.Fatal("leader campaign timeout") + t.T().Fatal("leader campaign timeout") } - c.Assert(e1.IsLeader(), check.IsTrue) + t.Require().True(e1.IsLeader()) _, leaderID, leaderAddr, err := e1.LeaderInfo(ctx1) - c.Assert(err, check.IsNil) - c.Assert(leaderID, check.Equals, e1.ID()) - c.Assert(leaderAddr, check.Equals, addr1) + t.Require().NoError(err) + t.Require().Equal(e1.ID(), leaderID) + t.Require().Equal(addr1, leaderAddr) // start e2 ctx2, cancel2 := context.WithCancel(context.Background()) defer cancel2() e2, err := NewElection(ctx2, cli, sessionTTL, key, ID2, addr2, t.notifyBlockTime) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer e2.Close() select { case leader := <-e2.leaderCh: - c.Assert(leader.ID, check.Equals, ID1) + t.Require().Equal(ID1, leader.ID) case <-time.After(timeout): - c.Fatal("leader campaign timeout") + t.T().Fatal("leader campaign timeout") } // but the leader should still be e1 _, leaderID, leaderAddr, err = e2.LeaderInfo(ctx2) - c.Assert(err, check.IsNil) - c.Assert(leaderID, check.Equals, e1.ID()) - c.Assert(leaderAddr, check.Equals, addr1) - c.Assert(e2.IsLeader(), check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(e1.ID(), leaderID) + t.Require().Equal(addr1, leaderAddr) + t.Require().False(e2.IsLeader()) - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/election/mockCapaignSucceedButReturnErr", `return()`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/election/mockCapaignSucceedButReturnErr", `return()`)) //nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/pkg/election/mockCapaignSucceedButReturnErr") e1.Close() // stop the campaign for e1 - c.Assert(e1.IsLeader(), check.IsFalse) + t.Require().False(e1.IsLeader()) // e2 should become the leader select { case leader := <-e2.LeaderNotify(): - c.Assert(leader.ID, check.Equals, ID2) + t.Require().Equal(ID2, leader.ID) case <-time.After(timeout): - c.Fatal("leader campaign timeout") + t.T().Fatal("leader campaign timeout") } // the leader retired after deleted the key select { case err2 := <-e2.ErrorNotify(): - c.Fatalf("delete the leader key should not get an error, %v", err2) + t.T().Fatalf("delete the leader key should not get an error, %v", err2) case leader := <-e2.LeaderNotify(): - c.Assert(leader, check.IsNil) + t.Require().Nil(leader) case <-time.After(timeout): - c.Fatal("leader retire timeout") + t.T().Fatal("leader retire timeout") } } diff --git a/dm/pkg/etcdutil/etcdutil_test.go b/dm/pkg/etcdutil/etcdutil_test.go index de37a5b8ec..0267bf5e0a 100644 --- a/dm/pkg/etcdutil/etcdutil_test.go +++ b/dm/pkg/etcdutil/etcdutil_test.go @@ -20,11 +20,11 @@ import ( "testing" "time" - "github.com/pingcap/check" "github.com/pingcap/failpoint" "github.com/pingcap/tiflow/dm/pkg/log" "github.com/pingcap/tiflow/dm/pkg/terror" "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "github.com/tikv/pd/pkg/utils/tempurl" "go.etcd.io/etcd/api/v3/etcdserverpb" v3rpc "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" @@ -34,41 +34,36 @@ import ( "go.etcd.io/etcd/tests/v3/integration" ) -var etcdTestSuite = check.Suite(&testEtcdUtilSuite{}) - type testEtcdUtilSuite struct { - testT *testing.T + suite.Suite } -func (t *testEtcdUtilSuite) SetUpSuite(c *check.C) { +func (t *testEtcdUtilSuite) SetupSuite() { // initialized the logger to make genEmbedEtcdConfig working. - c.Assert(log.InitLogger(&log.Config{}), check.IsNil) + t.Require().NoError(log.InitLogger(&log.Config{})) // this is to trigger `etcd.io/etcd/embed.(*Config).setupLogging()` // otherwise `newConfig` will datarace with `TestDoOpsInOneTxnWithRetry.NewClusterV3.Launch.m.grpcServer.Serve(m.grpcListener)` - t.newConfig(c, "not used", 1) + t.newConfig("not used", 1) } func TestSuite(t *testing.T) { integration.BeforeTestExternal(t) - // inject *testing.T to suite - s := etcdTestSuite.(*testEtcdUtilSuite) - s.testT = t - check.TestingT(t) + suite.Run(t, new(testEtcdUtilSuite)) } -func (t *testEtcdUtilSuite) newConfig(c *check.C, name string, portCount int) *embed.Config { +func (t *testEtcdUtilSuite) newConfig(name string, portCount int) *embed.Config { cfg := embed.NewConfig() cfg.Name = name - cfg.Dir = c.MkDir() + cfg.Dir = t.T().TempDir() cfg.ZapLoggerBuilder = embed.NewZapCoreLoggerBuilder(log.L().Logger, log.L().Core(), log.Props().Syncer) cfg.Logger = "zap" - c.Assert(cfg.Validate(), check.IsNil) + t.Require().NoError(cfg.Validate()) cfg.ListenClientUrls = []url.URL{} for i := 0; i < portCount; i++ { endPoint := tempurl.Alloc() cu, err2 := url.Parse(endPoint) - c.Assert(err2, check.IsNil) + t.Require().NoError(err2) cfg.ListenClientUrls = append(cfg.ListenClientUrls, *cu) } @@ -78,7 +73,7 @@ func (t *testEtcdUtilSuite) newConfig(c *check.C, name string, portCount int) *e for i := 0; i < portCount; i++ { endPoint := tempurl.Alloc() pu, err2 := url.Parse(endPoint) - c.Assert(err2, check.IsNil) + t.Require().NoError(err2) cfg.ListenPeerUrls = append(cfg.ListenPeerUrls, *pu) ic = append(ic, fmt.Sprintf("%s=%s", cfg.Name, pu)) } @@ -96,109 +91,109 @@ func (t *testEtcdUtilSuite) urlsToStrings(urls []url.URL) []string { return ret } -func (t *testEtcdUtilSuite) startEtcd(c *check.C, cfg *embed.Config) *embed.Etcd { +func (t *testEtcdUtilSuite) startEtcd(cfg *embed.Config) *embed.Etcd { e, err := embed.StartEtcd(cfg) - c.Assert(err, check.IsNil) + t.Require().NoError(err) timeout := 10 * time.Second select { case <-e.Server.ReadyNotify(): case <-time.After(timeout): e.Server.Stop() - c.Fatalf("start embed etcd timeout %v", timeout) + t.T().Fatalf("start embed etcd timeout %v", timeout) } return e } -func (t *testEtcdUtilSuite) createEtcdClient(c *check.C, endpoints []string) *clientv3.Client { +func (t *testEtcdUtilSuite) createEtcdClient(endpoints []string) *clientv3.Client { cli, err := CreateClient(endpoints, nil) - c.Assert(err, check.IsNil) + t.Require().NoError(err) return cli } -func (t *testEtcdUtilSuite) checkMember(c *check.C, mid uint64, m *etcdserverpb.Member, cfg *embed.Config) { +func (t *testEtcdUtilSuite) checkMember(mid uint64, m *etcdserverpb.Member, cfg *embed.Config) { if m.Name != "" { // no name exists after `member add` - c.Assert(m.Name, check.Equals, cfg.Name) + t.Require().Equal(cfg.Name, m.Name) } - c.Assert(m.ID, check.Equals, mid) - require.ElementsMatch(t.testT, m.ClientURLs, t.urlsToStrings(cfg.AdvertiseClientUrls)) - require.ElementsMatch(t.testT, m.PeerURLs, t.urlsToStrings(cfg.AdvertisePeerUrls)) + t.Require().Equal(mid, m.ID) + require.ElementsMatch(t.T(), m.ClientURLs, t.urlsToStrings(cfg.AdvertiseClientUrls)) + require.ElementsMatch(t.T(), m.PeerURLs, t.urlsToStrings(cfg.AdvertisePeerUrls)) } -func (t *testEtcdUtilSuite) TestMemberUtil(c *check.C) { +func (t *testEtcdUtilSuite) TestMemberUtil() { for i := 1; i <= 3; i++ { - t.testMemberUtilInternal(c, i) + t.testMemberUtilInternal(i) } } -func (t *testEtcdUtilSuite) testMemberUtilInternal(c *check.C, portCount int) { +func (t *testEtcdUtilSuite) testMemberUtilInternal(portCount int) { // start a etcd - cfg1 := t.newConfig(c, "etcd1", portCount) + cfg1 := t.newConfig("etcd1", portCount) endpoints1 := t.urlsToStrings(cfg1.ListenClientUrls) - etcd1 := t.startEtcd(c, cfg1) + etcd1 := t.startEtcd(cfg1) defer etcd1.Close() // list member - cli := t.createEtcdClient(c, endpoints1) + cli := t.createEtcdClient(endpoints1) listResp1, err := ListMembers(cli) - c.Assert(err, check.IsNil) - c.Assert(listResp1.Members, check.HasLen, 1) - t.checkMember(c, uint64(etcd1.Server.ID()), listResp1.Members[0], cfg1) + t.Require().NoError(err) + t.Require().Len(listResp1.Members, 1) + t.checkMember(uint64(etcd1.Server.ID()), listResp1.Members[0], cfg1) // add member - cfg2 := t.newConfig(c, "etcd2", portCount) + cfg2 := t.newConfig("etcd2", portCount) cfg2.InitialCluster = cfg1.InitialCluster + "," + cfg2.InitialCluster cfg2.ClusterState = embed.ClusterStateFlagExisting addResp, err := AddMember(cli, t.urlsToStrings(cfg2.AdvertisePeerUrls)) - c.Assert(err, check.IsNil) - c.Assert(addResp.Members, check.HasLen, 2) + t.Require().NoError(err) + t.Require().Len(addResp.Members, 2) // start the added member - etcd2 := t.startEtcd(c, cfg2) + etcd2 := t.startEtcd(cfg2) defer etcd2.Close() - c.Assert(addResp.Member.ID, check.Equals, uint64(etcd2.Server.ID())) + t.Require().Equal(uint64(etcd2.Server.ID()), addResp.Member.ID) // list member again listResp2, err := ListMembers(cli) - c.Assert(err, check.IsNil) - c.Assert(listResp2.Members, check.HasLen, 2) + t.Require().NoError(err) + t.Require().Len(listResp2.Members, 2) for _, m := range listResp2.Members { switch m.ID { case uint64(etcd1.Server.ID()): - t.checkMember(c, uint64(etcd1.Server.ID()), m, cfg1) + t.checkMember(uint64(etcd1.Server.ID()), m, cfg1) case uint64(etcd2.Server.ID()): - t.checkMember(c, uint64(etcd2.Server.ID()), m, cfg2) + t.checkMember(uint64(etcd2.Server.ID()), m, cfg2) default: - c.Fatalf("unknown member %v", m) + t.T().Fatalf("unknown member %v", m) } } } -func (t *testEtcdUtilSuite) TestRemoveMember(c *check.C) { +func (t *testEtcdUtilSuite) TestRemoveMember() { // test remove one member that is not the one we connected to. // if we remove the one we connected to, the test might fail, see more in https://github.com/etcd-io/etcd/pull/7242 - cluster := integration.NewClusterV3(t.testT, &integration.ClusterConfig{Size: 3}) - defer cluster.Terminate(t.testT) - leaderIdx := cluster.WaitLeader(t.testT) - c.Assert(leaderIdx, check.Not(check.Equals), -1) + cluster := integration.NewClusterV3(t.T(), &integration.ClusterConfig{Size: 3}) + defer cluster.Terminate(t.T()) + leaderIdx := cluster.WaitLeader(t.T()) + t.Require().NotEqual(-1, leaderIdx) cli := cluster.Client(leaderIdx) respList, err := ListMembers(cli) - c.Assert(err, check.IsNil) - c.Assert(respList.Members, check.HasLen, 3) + t.Require().NoError(err) + t.Require().Len(respList.Members, 3) for _, m := range respList.Members { if m.ID != respList.Header.MemberId { respRemove, removeErr := RemoveMember(cli, m.ID) - c.Assert(removeErr, check.IsNil) - c.Assert(respRemove.Members, check.HasLen, 2) + t.Require().NoError(removeErr) + t.Require().Len(respRemove.Members, 2) break } } respList, err = ListMembers(cli) - c.Assert(err, check.IsNil) - c.Assert(respList.Members, check.HasLen, 2) + t.Require().NoError(err) + t.Require().Len(respList.Members, 2) } -func (t *testEtcdUtilSuite) TestDoOpsInOneTxnWithRetry(c *check.C) { +func (t *testEtcdUtilSuite) TestDoOpsInOneTxnWithRetry() { var ( key1 = "/test/etcdutil/do-ops-in-one-txn-with-retry-1" key2 = "/test/etcdutil/do-ops-in-one-txn-with-retry-2" @@ -206,15 +201,15 @@ func (t *testEtcdUtilSuite) TestDoOpsInOneTxnWithRetry(c *check.C) { val2 = "bar" val = "foo-bar" ) - cluster := integration.NewClusterV3(t.testT, &integration.ClusterConfig{Size: 1}) - defer cluster.Terminate(t.testT) + cluster := integration.NewClusterV3(t.T(), &integration.ClusterConfig{Size: 1}) + defer cluster.Terminate(t.T()) cli := cluster.RandClient() resp, rev1, err := DoTxnWithRepeatable(cli, ThenOpFunc(clientv3.OpPut(key1, val1), clientv3.OpPut(key2, val2))) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) - c.Assert(resp.Responses, check.HasLen, 2) + t.Require().NoError(err) + t.Require().Greater(rev1, int64(0)) + t.Require().Len(resp.Responses, 2) // both cmps are true cmp1 := clientv3.Compare(clientv3.Value(key1), "=", val1) @@ -222,9 +217,9 @@ func (t *testEtcdUtilSuite) TestDoOpsInOneTxnWithRetry(c *check.C) { resp, rev2, err := DoTxnWithRepeatable(cli, FullOpFunc([]clientv3.Cmp{cmp1, cmp2}, []clientv3.Op{ clientv3.OpPut(key1, val), clientv3.OpPut(key2, val), }, []clientv3.Op{})) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) - c.Assert(resp.Responses, check.HasLen, 2) + t.Require().NoError(err) + t.Require().Greater(rev2, rev1) + t.Require().Len(resp.Responses, 2) // one of cmps are false cmp1 = clientv3.Compare(clientv3.Value(key1), "=", val) @@ -232,12 +227,12 @@ func (t *testEtcdUtilSuite) TestDoOpsInOneTxnWithRetry(c *check.C) { resp, rev3, err := DoTxnWithRepeatable(cli, FullOpFunc([]clientv3.Cmp{cmp1, cmp2}, []clientv3.Op{}, []clientv3.Op{ clientv3.OpDelete(key1), clientv3.OpDelete(key2), })) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Greater, rev2) - c.Assert(resp.Responses, check.HasLen, 2) + t.Require().NoError(err) + t.Require().Greater(rev3, rev2) + t.Require().Len(resp.Responses, 2) // enable failpoint - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/etcdutil/ErrNoSpace", `3*return()`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/etcdutil/ErrNoSpace", `3*return()`)) //nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/pkg/etcdutil/ErrNoSpace") @@ -245,17 +240,17 @@ func (t *testEtcdUtilSuite) TestDoOpsInOneTxnWithRetry(c *check.C) { resp, rev2, err = DoTxnWithRepeatable(cli, FullOpFunc([]clientv3.Cmp{clientv3util.KeyMissing(key1), clientv3util.KeyMissing(key2)}, []clientv3.Op{ clientv3.OpPut(key1, val), clientv3.OpPut(key2, val), }, []clientv3.Op{})) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) - c.Assert(resp.Responses, check.HasLen, 2) + t.Require().NoError(err) + t.Require().Greater(rev2, rev1) + t.Require().Len(resp.Responses, 2) } -func (t *testEtcdUtilSuite) TestIsRetryableError(c *check.C) { - c.Assert(IsRetryableError(v3rpc.ErrCompacted), check.IsTrue) - c.Assert(IsRetryableError(v3rpc.ErrNoLeader), check.IsTrue) - c.Assert(IsRetryableError(v3rpc.ErrNoSpace), check.IsTrue) +func (t *testEtcdUtilSuite) TestIsRetryableError() { + t.Require().True(IsRetryableError(v3rpc.ErrCompacted)) + t.Require().True(IsRetryableError(v3rpc.ErrNoLeader)) + t.Require().True(IsRetryableError(v3rpc.ErrNoSpace)) - c.Assert(IsRetryableError(v3rpc.ErrCorrupt), check.IsFalse) - c.Assert(IsRetryableError(terror.ErrDecodeEtcdKeyFail), check.IsFalse) - c.Assert(IsRetryableError(nil), check.IsFalse) + t.Require().False(IsRetryableError(v3rpc.ErrCorrupt)) + t.Require().False(IsRetryableError(terror.ErrDecodeEtcdKeyFail)) + t.Require().False(IsRetryableError(nil)) } diff --git a/dm/pkg/ha/bound_test.go b/dm/pkg/ha/bound_test.go index e4975ac1fe..84f0436491 100644 --- a/dm/pkg/ha/bound_test.go +++ b/dm/pkg/ha/bound_test.go @@ -17,25 +17,24 @@ import ( "context" "time" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/config" ) -func (t *testForEtcd) TestSourceBoundJSON(c *check.C) { +func (s *testForEtcd) TestSourceBoundJSON() { b1 := NewSourceBound("mysql-replica-1", "dm-worker-1") j, err := b1.toJSON() - c.Assert(err, check.IsNil) - c.Assert(j, check.Equals, `{"source":"mysql-replica-1","worker":"dm-worker-1"}`) - c.Assert(j, check.Equals, b1.String()) + s.Require().NoError(err) + s.Require().Equal(`{"source":"mysql-replica-1","worker":"dm-worker-1"}`, j) + s.Require().Equal(b1.String(), j) b2, err := sourceBoundFromJSON(j) - c.Assert(err, check.IsNil) - c.Assert(b2, check.DeepEquals, b1) + s.Require().NoError(err) + s.Require().Equal(b1, b2) } -func (t *testForEtcd) TestSourceBoundEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func (s *testForEtcd) TestSourceBoundEtcd() { + defer clearTestInfoOperation(s.T()) var ( watchTimeout = 2 * time.Second @@ -44,21 +43,21 @@ func (t *testForEtcd) TestSourceBoundEtcd(c *check.C) { bound1 = NewSourceBound("mysql-replica-1", worker1) bound2 = NewSourceBound("mysql-replica-2", worker2) ) - c.Assert(bound1.IsDeleted, check.IsFalse) + s.Require().False(bound1.IsDeleted) // no bound exists. sbm1, rev1, err := GetSourceBound(etcdTestCli, "") - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) - c.Assert(sbm1, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Greater(rev1, int64(0)) + s.Require().Len(sbm1, 0) // put two bounds. rev2, err := PutSourceBound(etcdTestCli, bound1) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + s.Require().NoError(err) + s.Require().Greater(rev2, rev1) rev3, err := PutSourceBound(etcdTestCli, bound2) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Greater, rev2) + s.Require().NoError(err) + s.Require().Greater(rev3, rev2) // watch the PUT operation for the bound1. boundCh := make(chan SourceBound, 10) @@ -68,36 +67,36 @@ func (t *testForEtcd) TestSourceBoundEtcd(c *check.C) { cancel() close(boundCh) close(errCh) - c.Assert(len(boundCh), check.Equals, 1) + s.Require().Equal(1, len(boundCh)) bound1.Revision = rev2 - c.Assert(<-boundCh, check.DeepEquals, bound1) - c.Assert(len(errCh), check.Equals, 0) + s.Require().Equal(bound1, <-boundCh) + s.Require().Equal(0, len(errCh)) // get bound1 back. sbm2, rev4, err := GetSourceBound(etcdTestCli, worker1) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Equals, rev3) - c.Assert(sbm2, check.HasLen, 1) - c.Assert(sbm2[worker1], check.DeepEquals, bound1) + s.Require().NoError(err) + s.Require().Equal(rev3, rev4) + s.Require().Len(sbm2, 1) + s.Require().Equal(bound1, sbm2[worker1]) // get bound1 and bound2 back. sbm2, rev4, err = GetSourceBound(etcdTestCli, "") - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Equals, rev3) - c.Assert(sbm2, check.HasLen, 2) - c.Assert(sbm2[worker1], check.DeepEquals, bound1) + s.Require().NoError(err) + s.Require().Equal(rev3, rev4) + s.Require().Len(sbm2, 2) + s.Require().Equal(bound1, sbm2[worker1]) bound2.Revision = rev3 - c.Assert(sbm2[worker2], check.DeepEquals, bound2) + s.Require().Equal(bound2, sbm2[worker2]) // delete bound1. rev5, err := DeleteSourceBound(etcdTestCli, worker1) - c.Assert(err, check.IsNil) - c.Assert(rev5, check.Greater, rev4) + s.Require().NoError(err) + s.Require().Greater(rev5, rev4) // delete bound2. rev6, err := DeleteSourceBound(etcdTestCli, worker2) - c.Assert(err, check.IsNil) - c.Assert(rev6, check.Greater, rev5) + s.Require().NoError(err) + s.Require().Greater(rev6, rev5) // watch the DELETE operation for bound1. boundCh = make(chan SourceBound, 10) @@ -107,21 +106,21 @@ func (t *testForEtcd) TestSourceBoundEtcd(c *check.C) { cancel() close(boundCh) close(errCh) - c.Assert(len(boundCh), check.Equals, 1) + s.Require().Equal(1, len(boundCh)) bo := <-boundCh - c.Assert(bo.IsDeleted, check.IsTrue) - c.Assert(bo.Revision, check.Equals, rev5) - c.Assert(len(errCh), check.Equals, 0) + s.Require().True(bo.IsDeleted) + s.Require().Equal(rev5, bo.Revision) + s.Require().Equal(0, len(errCh)) // get again, bound1 not exists now. sbm3, rev7, err := GetSourceBound(etcdTestCli, worker1) - c.Assert(err, check.IsNil) - c.Assert(rev7, check.Equals, rev6) - c.Assert(sbm3, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Equal(rev6, rev7) + s.Require().Len(sbm3, 0) } -func (t *testForEtcd) TestGetSourceBoundConfigEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func (s *testForEtcd) TestGetSourceBoundConfigEtcd() { + defer clearTestInfoOperation(s.T()) var ( worker = "dm-worker-1" @@ -129,31 +128,32 @@ func (t *testForEtcd) TestGetSourceBoundConfigEtcd(c *check.C) { bound = NewSourceBound(source, worker) ) cfg, err := config.LoadFromFile(sourceSampleFilePath) - c.Assert(err, check.IsNil) + s.Require().NoError(err) cfg.SourceID = source // no source bound and config bound1, cfg1, rev1, err := GetSourceBoundConfig(etcdTestCli, worker) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) - c.Assert(bound1.IsEmpty(), check.IsTrue) - c.Assert(cfg1, check.IsNil) + s.Require().NoError(err) + s.Require().Greater(rev1, int64(0)) + s.Require().True(bound1.IsEmpty()) + s.Require().Nil(cfg1) rev2, err := PutSourceBound(etcdTestCli, bound) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + s.Require().NoError(err) + s.Require().Greater(rev2, rev1) // get source bound and config, but config is empty // nolint:dogsled _, _, _, err = GetSourceBoundConfig(etcdTestCli, worker) - c.Assert(err, check.ErrorMatches, ".*doesn't have related source config in etcd.*") + s.Require().Error(err) + s.Require().Regexp(".*doesn't have related source config in etcd.*", err.Error()) rev3, err := PutSourceCfg(etcdTestCli, cfg) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Greater, rev2) + s.Require().NoError(err) + s.Require().Greater(rev3, rev2) // get source bound and config bound2, cfg2, rev4, err := GetSourceBoundConfig(etcdTestCli, worker) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Equals, rev3) + s.Require().NoError(err) + s.Require().Equal(rev3, rev4) bound.Revision = rev2 - c.Assert(bound2, check.DeepEquals, bound) - c.Assert(cfg2, check.DeepEquals, cfg) + s.Require().Equal(bound, bound2) + s.Require().Equal(cfg, cfg2) } diff --git a/dm/pkg/ha/keepalive_test.go b/dm/pkg/ha/keepalive_test.go index 6960890116..c93e9045f0 100644 --- a/dm/pkg/ha/keepalive_test.go +++ b/dm/pkg/ha/keepalive_test.go @@ -20,7 +20,6 @@ import ( "sync/atomic" "time" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/pkg/utils" ) @@ -28,11 +27,11 @@ import ( // minLeaseTTL is 1 in etcd cluster. var keepAliveTTL = int64(0) -func (t *testForEtcd) TestWorkerKeepAlive(c *check.C) { - defer clearTestInfoOperation(c) +func (s *testForEtcd) TestWorkerKeepAlive() { + defer clearTestInfoOperation(s.T()) wwm, rev, err := GetKeepAliveWorkers(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(wwm, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Len(wwm, 0) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -56,17 +55,17 @@ func (t *testForEtcd) TestWorkerKeepAlive(c *check.C) { cancels = append(cancels, cancel1) go func(ctx context.Context) { err1 := KeepAlive(ctx, etcdTestCli, worker, keepAliveTTL) - c.Assert(err1, check.IsNil, check.Commentf("if \"context canceled\", retry later\ncause: context used in `KeepAlive` exceed timeout of 10s (`etcdutil.DefaultRequestTimeout`)")) + s.Require().NoError(err1, "if \"context canceled\", retry later\ncause: context used in `KeepAlive` exceed timeout of 10s (`etcdutil.DefaultRequestTimeout`)") atomic.AddInt32(&finished, 1) }(ctx1) select { case ev := <-evCh: - c.Assert(ev.IsDeleted, check.IsFalse) - c.Assert(ev.WorkerName, check.Equals, worker) - c.Assert(ev.JoinTime.Before(curTime), check.IsFalse) + s.Require().False(ev.IsDeleted) + s.Require().Equal(worker, ev.WorkerName) + s.Require().False(ev.JoinTime.Before(curTime)) case <-time.After(timeout): - c.Fatal("fail to receive put ev " + strconv.Itoa(i) + " before timeout") + s.T().Fatal("fail to receive put ev " + strconv.Itoa(i) + " before timeout") } } @@ -75,32 +74,32 @@ func (t *testForEtcd) TestWorkerKeepAlive(c *check.C) { cancel1() select { case ev := <-evCh: - c.Assert(ev.IsDeleted, check.IsTrue) - c.Assert(ev.WorkerName, check.Equals, worker) + s.Require().True(ev.IsDeleted) + s.Require().Equal(worker, ev.WorkerName) case <-time.After(timeout): - c.Fatal("fail to receive delete ev " + strconv.Itoa(i+1) + " before timeout") + s.T().Fatal("fail to receive delete ev " + strconv.Itoa(i+1) + " before timeout") } } waitKeepAliveQuit := utils.WaitSomething(100, timeout, func() bool { return atomic.LoadInt32(&finished) == 5 }) - c.Assert(waitKeepAliveQuit, check.IsTrue) + s.Require().True(waitKeepAliveQuit) cancel() select { case <-closed: case <-time.After(timeout): - c.Fatal("fail to quit WatchWorkerEvent before timeout") + s.T().Fatal("fail to quit WatchWorkerEvent before timeout") } - c.Assert(errCh, check.HasLen, 0) + s.Require().Len(errCh, 0) } -func (t *testForEtcd) TestKeepAliveRevokeLease(c *check.C) { - defer clearTestInfoOperation(c) +func (s *testForEtcd) TestKeepAliveRevokeLease() { + defer clearTestInfoOperation(s.T()) wwm, rev, err := GetKeepAliveWorkers(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(wwm, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Len(wwm, 0) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -121,7 +120,7 @@ func (t *testForEtcd) TestKeepAliveRevokeLease(c *check.C) { go func(ctx context.Context, cancel1 context.CancelFunc) { err1 := KeepAlive(ctx, etcdTestCli, worker, hugeKeepAliveTTL) cancel1() - c.Assert(err1, check.IsNil) + s.Require().NoError(err1) atomic.AddInt32(&finished, 1) }(ctx1, cancel1) } @@ -129,9 +128,9 @@ func (t *testForEtcd) TestKeepAliveRevokeLease(c *check.C) { ctx1, cancel1 := context.WithTimeout(ctx, 10*time.Second) WatchWorkerEvent(ctx1, etcdTestCli, rev, evCh, errCh) cancel1() - c.Assert(evCh, check.HasLen, 100) - c.Assert(errCh, check.HasLen, 0) - c.Assert(atomic.LoadInt32(&finished), check.Equals, int32(50)) + s.Require().Len(evCh, 100) + s.Require().Len(errCh, 0) + s.Require().Equal(int32(50), atomic.LoadInt32(&finished)) for len(evCh) > 0 { ev := <-evCh if ev.IsDeleted { @@ -143,6 +142,6 @@ func (t *testForEtcd) TestKeepAliveRevokeLease(c *check.C) { sort.Strings(putEvent) sort.Strings(deleteEvent) sort.Strings(workerSet) - c.Assert(putEvent, check.DeepEquals, workerSet) - c.Assert(deleteEvent, check.DeepEquals, workerSet) + s.Require().Equal(workerSet, putEvent) + s.Require().Equal(workerSet, deleteEvent) } diff --git a/dm/pkg/ha/load_task_test.go b/dm/pkg/ha/load_task_test.go index 57ef487028..ba2c9dd96d 100644 --- a/dm/pkg/ha/load_task_test.go +++ b/dm/pkg/ha/load_task_test.go @@ -16,11 +16,9 @@ package ha import ( "context" "time" - - "github.com/pingcap/check" ) -func (t *testForEtcd) TestLoadTaskEtcd(c *check.C) { +func (s *testForEtcd) TestLoadTaskEtcd() { var ( worker1 = "worker1" worker2 = "worker2" @@ -30,81 +28,81 @@ func (t *testForEtcd) TestLoadTaskEtcd(c *check.C) { task2 = "task2" watchTimeout = 2 * time.Second ) - defer clearTestInfoOperation(c) + defer clearTestInfoOperation(s.T()) // no load worker exist. tlswm, rev1, err := GetAllLoadTask(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(tlswm, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Len(tlswm, 0) // put load worker for task1, source1, worker1 rev2, err := PutLoadTask(etcdTestCli, task1, source1, worker1) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + s.Require().NoError(err) + s.Require().Greater(rev2, rev1) // get worker for task1, source1 worker, rev3, err := GetLoadTask(etcdTestCli, task1, source1) - c.Assert(err, check.IsNil) - c.Assert(worker, check.Equals, worker1) - c.Assert(rev3, check.Equals, rev2) + s.Require().NoError(err) + s.Require().Equal(worker1, worker) + s.Require().Equal(rev2, rev3) // put load worker for task1, source1, worker1 again rev4, err := PutLoadTask(etcdTestCli, task1, source1, worker1) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Greater, rev3) + s.Require().NoError(err) + s.Require().Greater(rev4, rev3) // get worker for task1, source1 again worker, rev5, err := GetLoadTask(etcdTestCli, task1, source1) - c.Assert(err, check.IsNil) - c.Assert(worker, check.Equals, worker1) - c.Assert(rev5, check.Equals, rev4) + s.Require().NoError(err) + s.Require().Equal(worker1, worker) + s.Require().Equal(rev4, rev5) // put load worker for task1, source2, worker2 rev6, err := PutLoadTask(etcdTestCli, task1, source2, worker2) - c.Assert(err, check.IsNil) - c.Assert(rev6, check.Greater, rev5) + s.Require().NoError(err) + s.Require().Greater(rev6, rev5) // get all load worker tlswm, rev7, err := GetAllLoadTask(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev7, check.Equals, rev6) - c.Assert(tlswm, check.HasLen, 1) - c.Assert(tlswm, check.HasKey, task1) - c.Assert(tlswm[task1], check.HasKey, source1) - c.Assert(tlswm[task1], check.HasKey, source2) - c.Assert(tlswm[task1][source1], check.Equals, worker1) - c.Assert(tlswm[task1][source2], check.Equals, worker2) + s.Require().NoError(err) + s.Require().Equal(rev6, rev7) + s.Require().Len(tlswm, 1) + s.Require().Contains(tlswm, task1) + s.Require().Contains(tlswm[task1], source1) + s.Require().Contains(tlswm[task1], source2) + s.Require().Equal(worker1, tlswm[task1][source1]) + s.Require().Equal(worker2, tlswm[task1][source2]) // Delete load worker for task1, source1 rev8, succ, err := DelLoadTask(etcdTestCli, task1, source1) - c.Assert(err, check.IsNil) - c.Assert(rev8, check.Greater, rev7) - c.Assert(succ, check.IsTrue) + s.Require().NoError(err) + s.Require().Greater(rev8, rev7) + s.Require().True(succ) worker, rev9, err := GetLoadTask(etcdTestCli, task1, source1) - c.Assert(err, check.IsNil) - c.Assert(rev9, check.Equals, rev8) - c.Assert(worker, check.Equals, "") + s.Require().NoError(err) + s.Require().Equal(rev8, rev9) + s.Require().Equal("", worker) worker, rev10, err := GetLoadTask(etcdTestCli, task1, source2) - c.Assert(err, check.IsNil) - c.Assert(rev10, check.Equals, rev9) - c.Assert(worker, check.Equals, worker2) + s.Require().NoError(err) + s.Require().Equal(rev9, rev10) + s.Require().Equal(worker2, worker) // Delete load worker by task rev11, succ, err := DelLoadTaskByTask(etcdTestCli, task1) - c.Assert(err, check.IsNil) - c.Assert(rev11, check.Greater, rev10) - c.Assert(succ, check.IsTrue) + s.Require().NoError(err) + s.Require().Greater(rev11, rev10) + s.Require().True(succ) tslwm, rev12, err := GetAllLoadTask(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev12, check.Equals, rev11) - c.Assert(tslwm, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Equal(rev11, rev12) + s.Require().Len(tslwm, 0) rev13, err := PutLoadTask(etcdTestCli, task2, source1, worker2) - c.Assert(err, check.IsNil) - c.Assert(rev13, check.Greater, rev12) + s.Require().NoError(err) + s.Require().Greater(rev13, rev12) // watch operations for the load worker. loadTaskCh := make(chan LoadTask, 10) @@ -114,18 +112,18 @@ func (t *testForEtcd) TestLoadTaskEtcd(c *check.C) { cancel() close(loadTaskCh) close(errCh) - c.Assert(len(loadTaskCh), check.Equals, 3) + s.Require().Equal(3, len(loadTaskCh)) delLoadTask1 := <-loadTaskCh - c.Assert(delLoadTask1.Task, check.Equals, task1) - c.Assert(delLoadTask1.Source, check.Equals, source1) - c.Assert(delLoadTask1.IsDelete, check.IsTrue) + s.Require().Equal(task1, delLoadTask1.Task) + s.Require().Equal(source1, delLoadTask1.Source) + s.Require().True(delLoadTask1.IsDelete) DelLoadTask2 := <-loadTaskCh - c.Assert(DelLoadTask2.Task, check.Equals, task1) - c.Assert(DelLoadTask2.Source, check.Equals, source2) - c.Assert(DelLoadTask2.IsDelete, check.IsTrue) + s.Require().Equal(task1, DelLoadTask2.Task) + s.Require().Equal(source2, DelLoadTask2.Source) + s.Require().True(DelLoadTask2.IsDelete) putLoadTask := <-loadTaskCh - c.Assert(putLoadTask.Task, check.Equals, task2) - c.Assert(putLoadTask.Source, check.Equals, source1) - c.Assert(putLoadTask.IsDelete, check.IsFalse) - c.Assert(putLoadTask.Worker, check.Equals, worker2) + s.Require().Equal(task2, putLoadTask.Task) + s.Require().Equal(source1, putLoadTask.Source) + s.Require().False(putLoadTask.IsDelete) + s.Require().Equal(worker2, putLoadTask.Worker) } diff --git a/dm/pkg/ha/openapi_task_config_test.go b/dm/pkg/ha/openapi_task_config_test.go index dce9ca10b8..e5d55e544f 100644 --- a/dm/pkg/ha/openapi_task_config_test.go +++ b/dm/pkg/ha/openapi_task_config_test.go @@ -14,77 +14,76 @@ package ha import ( - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/openapi" "github.com/pingcap/tiflow/dm/openapi/fixtures" "github.com/pingcap/tiflow/dm/pkg/terror" ) -func (t *testForEtcd) TestOpenAPITaskConfigEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func (s *testForEtcd) TestOpenAPITaskConfigEtcd() { + defer clearTestInfoOperation(s.T()) task1, err := fixtures.GenNoShardOpenAPITaskForTest() task1.Name = "test-1" - c.Assert(err, check.IsNil) + s.Require().NoError(err) task2, err := fixtures.GenShardAndFilterOpenAPITaskForTest() task2.Name = "test-2" - c.Assert(err, check.IsNil) + s.Require().NoError(err) // no openapi task config exist. task1InEtcd, err := GetOpenAPITaskTemplate(etcdTestCli, task1.Name) - c.Assert(err, check.IsNil) - c.Assert(task1InEtcd, check.IsNil) + s.Require().NoError(err) + s.Require().Nil(task1InEtcd) task2InEtcd, err := GetOpenAPITaskTemplate(etcdTestCli, task2.Name) - c.Assert(err, check.IsNil) - c.Assert(task2InEtcd, check.IsNil) + s.Require().NoError(err) + s.Require().Nil(task2InEtcd) tasks, err := GetAllOpenAPITaskTemplate(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(tasks, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Len(tasks, 0) // put openapi task config . - c.Assert(PutOpenAPITaskTemplate(etcdTestCli, task1, false), check.IsNil) - c.Assert(PutOpenAPITaskTemplate(etcdTestCli, task2, false), check.IsNil) + s.Require().NoError(PutOpenAPITaskTemplate(etcdTestCli, task1, false)) + s.Require().NoError(PutOpenAPITaskTemplate(etcdTestCli, task2, false)) task1InEtcd, err = GetOpenAPITaskTemplate(etcdTestCli, task1.Name) - c.Assert(err, check.IsNil) - c.Assert(*task1InEtcd, check.DeepEquals, task1) + s.Require().NoError(err) + s.Require().Equal(task1, *task1InEtcd) task2InEtcd, err = GetOpenAPITaskTemplate(etcdTestCli, task2.Name) - c.Assert(err, check.IsNil) - c.Assert(*task2InEtcd, check.DeepEquals, task2) + s.Require().NoError(err) + s.Require().Equal(task2, *task2InEtcd) tasks, err = GetAllOpenAPITaskTemplate(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(tasks, check.HasLen, 2) + s.Require().NoError(err) + s.Require().Len(tasks, 2) // put openapi task config again without overwrite will fail - c.Assert(terror.ErrOpenAPITaskConfigExist.Equal(PutOpenAPITaskTemplate(etcdTestCli, task1, false)), check.IsTrue) + s.Require().True(terror.ErrOpenAPITaskConfigExist.Equal(PutOpenAPITaskTemplate(etcdTestCli, task1, false))) // in overwrite mode, it will overwrite the old one. task1.TaskMode = openapi.TaskTaskModeFull - c.Assert(PutOpenAPITaskTemplate(etcdTestCli, task1, true), check.IsNil) + s.Require().NoError(PutOpenAPITaskTemplate(etcdTestCli, task1, true)) task1InEtcd, err = GetOpenAPITaskTemplate(etcdTestCli, task1.Name) - c.Assert(err, check.IsNil) - c.Assert(*task1InEtcd, check.DeepEquals, task1) + s.Require().NoError(err) + s.Require().Equal(task1, *task1InEtcd) // put task config that not exist will fail task3, err := fixtures.GenNoShardOpenAPITaskForTest() - c.Assert(err, check.IsNil) + s.Require().NoError(err) task3.Name = "test-3" - c.Assert(terror.ErrOpenAPITaskConfigNotExist.Equal(UpdateOpenAPITaskTemplate(etcdTestCli, task3)), check.IsTrue) + s.Require().True(terror.ErrOpenAPITaskConfigNotExist.Equal(UpdateOpenAPITaskTemplate(etcdTestCli, task3))) // update exist openapi task config will success task1.TaskMode = openapi.TaskTaskModeAll - c.Assert(UpdateOpenAPITaskTemplate(etcdTestCli, task1), check.IsNil) + s.Require().NoError(UpdateOpenAPITaskTemplate(etcdTestCli, task1)) task1InEtcd, err = GetOpenAPITaskTemplate(etcdTestCli, task1.Name) - c.Assert(err, check.IsNil) - c.Assert(*task1InEtcd, check.DeepEquals, task1) + s.Require().NoError(err) + s.Require().Equal(task1, *task1InEtcd) // delete task config - c.Assert(DeleteOpenAPITaskTemplate(etcdTestCli, task1.Name), check.IsNil) + s.Require().NoError(DeleteOpenAPITaskTemplate(etcdTestCli, task1.Name)) tasks, err = GetAllOpenAPITaskTemplate(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(tasks, check.HasLen, 1) + s.Require().NoError(err) + s.Require().Len(tasks, 1) } diff --git a/dm/pkg/ha/ops_test.go b/dm/pkg/ha/ops_test.go index c9dd238516..f2859ee0e8 100644 --- a/dm/pkg/ha/ops_test.go +++ b/dm/pkg/ha/ops_test.go @@ -14,13 +14,12 @@ package ha import ( - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/config" "github.com/pingcap/tiflow/dm/pb" ) -func (t *testForEtcd) TestOpsEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func (s *testForEtcd) TestOpsEtcd() { + defer clearTestInfoOperation(s.T()) var ( source = "mysql-replica-1" @@ -38,112 +37,112 @@ func (t *testForEtcd) TestOpsEtcd(c *check.C) { ) sourceCfg, err := config.LoadFromFile(sourceSampleFilePath) - c.Assert(err, check.IsNil) + s.Require().NoError(err) sourceCfg.SourceID = source - c.Assert(subtaskCfg1.Decode(config.SampleSubtaskConfig, true), check.IsNil) + s.Require().NoError(subtaskCfg1.Decode(config.SampleSubtaskConfig, true)) subtaskCfg1.SourceID = source subtaskCfg1.Name = task1 - c.Assert(subtaskCfg1.Adjust(true), check.IsNil) + s.Require().NoError(subtaskCfg1.Adjust(true)) subtaskCfg2 := subtaskCfg1 subtaskCfg2.Name = task2 - c.Assert(subtaskCfg2.Adjust(true), check.IsNil) + s.Require().NoError(subtaskCfg2.Adjust(true)) // put relay stage and source bound. rev1, err := PutRelayStageRelayConfigSourceBound(etcdTestCli, relayStage, bound) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) + s.Require().NoError(err) + s.Require().Greater(rev1, int64(0)) // put source config. rev2, err := PutSourceCfg(etcdTestCli, sourceCfg) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + s.Require().NoError(err) + s.Require().Greater(rev2, rev1) // get them back. st1, rev3, err := GetRelayStage(etcdTestCli, source) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) + s.Require().NoError(err) + s.Require().Equal(rev2, rev3) relayStage.Revision = rev1 - c.Assert(st1, check.DeepEquals, relayStage) + s.Require().Equal(relayStage, st1) sbm1, rev3, err := GetSourceBound(etcdTestCli, worker) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) - c.Assert(sbm1, check.HasLen, 1) + s.Require().NoError(err) + s.Require().Equal(rev2, rev3) + s.Require().Len(sbm1, 1) bound.Revision = rev1 - c.Assert(sbm1[worker], check.DeepEquals, bound) + s.Require().Equal(bound, sbm1[worker]) scm1, rev3, err := GetSourceCfg(etcdTestCli, source, 0) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) + s.Require().NoError(err) + s.Require().Equal(rev2, rev3) soCfg1 := scm1[source] - c.Assert(soCfg1, check.DeepEquals, sourceCfg) + s.Require().Equal(sourceCfg, soCfg1) // delete source config, relay stage and source bound. rev4, err := DeleteSourceCfgRelayStageSourceBound(etcdTestCli, source, worker) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Greater, rev3) + s.Require().NoError(err) + s.Require().Greater(rev4, rev3) // try to get them back again. st2, rev5, err := GetRelayStage(etcdTestCli, source) - c.Assert(err, check.IsNil) - c.Assert(rev5, check.Equals, rev4) - c.Assert(st2, check.Equals, emptyStage) + s.Require().NoError(err) + s.Require().Equal(rev4, rev5) + s.Require().Equal(emptyStage, st2) sbm2, rev5, err := GetSourceBound(etcdTestCli, worker) - c.Assert(err, check.IsNil) - c.Assert(rev5, check.Equals, rev4) - c.Assert(sbm2, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Equal(rev4, rev5) + s.Require().Len(sbm2, 0) scm2, rev5, err := GetSourceCfg(etcdTestCli, source, 0) - c.Assert(err, check.IsNil) - c.Assert(rev5, check.Equals, rev4) - c.Assert(scm2, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Equal(rev4, rev5) + s.Require().Len(scm2, 0) // put subtask config and subtask stage. rev6, err := PutSubTaskCfgStage(etcdTestCli, []config.SubTaskConfig{subtaskCfg1, subtaskCfg2}, []Stage{subtaskStage1, subtaskStage2}, []Stage{validatorStage}) - c.Assert(err, check.IsNil) - c.Assert(rev6, check.Greater, rev5) + s.Require().NoError(err) + s.Require().Greater(rev6, rev5) // get them back. stcm, rev7, err := GetSubTaskCfg(etcdTestCli, source, "", 0) - c.Assert(err, check.IsNil) - c.Assert(rev7, check.Equals, rev6) - c.Assert(stcm, check.HasLen, 2) - c.Assert(stcm[task1], check.DeepEquals, subtaskCfg1) - c.Assert(stcm[task2], check.DeepEquals, subtaskCfg2) + s.Require().NoError(err) + s.Require().Equal(rev6, rev7) + s.Require().Len(stcm, 2) + s.Require().Equal(subtaskCfg1, stcm[task1]) + s.Require().Equal(subtaskCfg2, stcm[task2]) stsm, rev7, err := GetSubTaskStage(etcdTestCli, source, "") - c.Assert(err, check.IsNil) - c.Assert(rev7, check.Equals, rev6) - c.Assert(stsm, check.HasLen, 2) + s.Require().NoError(err) + s.Require().Equal(rev6, rev7) + s.Require().Len(stsm, 2) subtaskStage1.Revision = rev6 subtaskStage2.Revision = rev6 - c.Assert(stsm[task1], check.DeepEquals, subtaskStage1) - c.Assert(stsm[task2], check.DeepEquals, subtaskStage2) + s.Require().Equal(subtaskStage1, stsm[task1]) + s.Require().Equal(subtaskStage2, stsm[task2]) validatorStages, rev7, err := GetValidatorStage(etcdTestCli, source, "", rev6) - c.Assert(err, check.IsNil) - c.Assert(rev7, check.Equals, rev6) - c.Assert(validatorStages, check.HasLen, 1) + s.Require().NoError(err) + s.Require().Equal(rev6, rev7) + s.Require().Len(validatorStages, 1) validatorStage.Revision = rev6 - c.Assert(validatorStages[task2], check.DeepEquals, validatorStage) + s.Require().Equal(validatorStage, validatorStages[task2]) // get with task name validatorStages, rev7, err = GetValidatorStage(etcdTestCli, source, task2, rev6) - c.Assert(err, check.IsNil) - c.Assert(rev7, check.Equals, rev6) - c.Assert(validatorStages, check.HasLen, 1) + s.Require().NoError(err) + s.Require().Equal(rev6, rev7) + s.Require().Len(validatorStages, 1) validatorStage.Revision = rev6 - c.Assert(validatorStages[task2], check.DeepEquals, validatorStage) + s.Require().Equal(validatorStage, validatorStages[task2]) // delete them. rev8, err := DeleteSubTaskCfgStage(etcdTestCli, []config.SubTaskConfig{subtaskCfg1, subtaskCfg2}, []Stage{subtaskStage1, subtaskStage2}, []Stage{validatorStage}) - c.Assert(err, check.IsNil) - c.Assert(rev8, check.Greater, rev7) + s.Require().NoError(err) + s.Require().Greater(rev8, rev7) // try to get them back again. stcm, rev9, err := GetSubTaskCfg(etcdTestCli, source, "", 0) - c.Assert(err, check.IsNil) - c.Assert(rev9, check.Equals, rev8) - c.Assert(stcm, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Equal(rev8, rev9) + s.Require().Len(stcm, 0) stsm, rev9, err = GetSubTaskStage(etcdTestCli, source, "") - c.Assert(err, check.IsNil) - c.Assert(rev9, check.Equals, rev8) - c.Assert(stsm, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Equal(rev8, rev9) + s.Require().Len(stsm, 0) validatorStages, rev9, err = GetValidatorStage(etcdTestCli, source, "", 0) - c.Assert(err, check.IsNil) - c.Assert(rev9, check.Equals, rev8) - c.Assert(validatorStages, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Equal(rev8, rev9) + s.Require().Len(validatorStages, 0) } diff --git a/dm/pkg/ha/relay_test.go b/dm/pkg/ha/relay_test.go index d89dbed167..976eff9026 100644 --- a/dm/pkg/ha/relay_test.go +++ b/dm/pkg/ha/relay_test.go @@ -14,50 +14,50 @@ package ha import ( - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/config" ) -func (t *testForEtcd) TestGetRelayConfigEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func (s *testForEtcd) TestGetRelayConfigEtcd() { + defer clearTestInfoOperation(s.T()) var ( worker = "dm-worker-1" source = "mysql-replica-1" ) cfg, err := config.LoadFromFile(sourceSampleFilePath) - c.Assert(err, check.IsNil) + s.Require().NoError(err) cfg.SourceID = source // no relay source and config cfg1, rev1, err := GetRelayConfig(etcdTestCli, worker) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) - c.Assert(cfg1, check.IsNil) + s.Require().NoError(err) + s.Require().Greater(rev1, int64(0)) + s.Require().Nil(cfg1) rev2, err := PutRelayConfig(etcdTestCli, source, worker) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + s.Require().NoError(err) + s.Require().Greater(rev2, rev1) // get relay source and config, but config is empty _, _, err = GetRelayConfig(etcdTestCli, worker) - c.Assert(err, check.ErrorMatches, ".*doesn't have related source config in etcd.*") + s.Require().Error(err) + s.Require().Regexp(".*doesn't have related source config in etcd.*", err.Error()) rev3, err := PutSourceCfg(etcdTestCli, cfg) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Greater, rev2) + s.Require().NoError(err) + s.Require().Greater(rev3, rev2) // get relay source and config cfg2, rev4, err := GetRelayConfig(etcdTestCli, worker) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Equals, rev3) - c.Assert(cfg2, check.DeepEquals, cfg) + s.Require().NoError(err) + s.Require().Equal(rev3, rev4) + s.Require().Equal(cfg, cfg2) rev5, err := DeleteRelayConfig(etcdTestCli, worker) - c.Assert(err, check.IsNil) - c.Assert(rev5, check.Greater, rev4) + s.Require().NoError(err) + s.Require().Greater(rev5, rev4) // though source config is saved in etcd, relay source is deleted so return nothing cfg3, rev6, err := GetRelayConfig(etcdTestCli, worker) - c.Assert(err, check.IsNil) - c.Assert(rev6, check.Equals, rev5) - c.Assert(cfg3, check.IsNil) + s.Require().NoError(err) + s.Require().Equal(rev5, rev6) + s.Require().Nil(cfg3) } diff --git a/dm/pkg/ha/source_test.go b/dm/pkg/ha/source_test.go index da60e34cbc..d4b719b363 100644 --- a/dm/pkg/ha/source_test.go +++ b/dm/pkg/ha/source_test.go @@ -21,8 +21,9 @@ import ( "path" "testing" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/config" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" clientv3 "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/tests/v3/integration" ) @@ -82,97 +83,97 @@ func TestHA(t *testing.T) { etcdTestCli = mockCluster.RandClient() - check.TestingT(t) + suite.Run(t, new(testForEtcd)) } // clear keys in etcd test cluster. -func clearTestInfoOperation(c *check.C) { - c.Assert(ClearTestInfoOperation(etcdTestCli), check.IsNil) +func clearTestInfoOperation(t require.TestingT) { + require.NoError(t, ClearTestInfoOperation(etcdTestCli)) } -type testForEtcd struct{} - -var _ = check.Suite(&testForEtcd{}) +type testForEtcd struct { + suite.Suite +} -func (t *testForEtcd) SetUpTest(c *check.C) { - createTestFixture(c) +func (s *testForEtcd) SetupTest() { + createTestFixture(s.T()) } -func createTestFixture(c *check.C) { - dir := c.MkDir() +func createTestFixture(t *testing.T) { + dir := t.TempDir() caFilePath = path.Join(dir, caFile) err := os.WriteFile(caFilePath, []byte(caFileContent), 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) certFilePath = path.Join(dir, certFile) err = os.WriteFile(certFilePath, []byte(certFileContent), 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) keyFilePath = path.Join(dir, keyFile) err = os.WriteFile(keyFilePath, []byte(keyFileContent), 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) sourceSampleFilePath = path.Join(dir, sourceSampleFile) sourceFileContent := fmt.Sprintf(sourceFileContent, caFilePath, certFilePath, keyFilePath) err = os.WriteFile(sourceSampleFilePath, []byte(sourceFileContent), 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) } -func (t *testForEtcd) TestSourceEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func (s *testForEtcd) TestSourceEtcd() { + defer clearTestInfoOperation(s.T()) cfg, err := config.LoadFromFile(sourceSampleFilePath) - c.Assert(err, check.IsNil) + s.Require().NoError(err) source := cfg.SourceID cfgExtra := *cfg cfgExtra.SourceID = "mysql-replica-2" // no source config exist. scm1, rev1, err := GetSourceCfg(etcdTestCli, source, 0) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) - c.Assert(scm1, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Greater(rev1, int64(0)) + s.Require().Len(scm1, 0) cfgM, _, err := GetSourceCfg(etcdTestCli, "", 0) - c.Assert(err, check.IsNil) - c.Assert(cfgM, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Len(cfgM, 0) // put a source config. - c.Assert(cfg.From.Security.LoadTLSContent(), check.IsNil) + s.Require().NoError(cfg.From.Security.LoadTLSContent()) rev2, err := PutSourceCfg(etcdTestCli, cfg) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + s.Require().NoError(err) + s.Require().Greater(rev2, rev1) // get the config back. scm2, rev3, err := GetSourceCfg(etcdTestCli, source, 0) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) + s.Require().NoError(err) + s.Require().Equal(rev2, rev3) cfg2 := scm2[source] - c.Assert(cfg2, check.DeepEquals, cfg) + s.Require().Equal(cfg, cfg2) noContentBytes := []byte("test no content") - c.Assert(bytes.Contains(cfg2.From.Security.SSLCABytes, noContentBytes), check.Equals, true) - c.Assert(bytes.Contains(cfg2.From.Security.SSLKeyBytes, noContentBytes), check.Equals, true) - c.Assert(bytes.Contains(cfg2.From.Security.SSLCertBytes, noContentBytes), check.Equals, true) + s.Require().Equal(true, bytes.Contains(cfg2.From.Security.SSLCABytes, noContentBytes)) + s.Require().Equal(true, bytes.Contains(cfg2.From.Security.SSLKeyBytes, noContentBytes)) + s.Require().Equal(true, bytes.Contains(cfg2.From.Security.SSLCertBytes, noContentBytes)) // put another source config. rev2, err = PutSourceCfg(etcdTestCli, &cfgExtra) - c.Assert(err, check.IsNil) + s.Require().NoError(err) // get all two config. cfgM, rev3, err = GetSourceCfg(etcdTestCli, "", 0) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) - c.Assert(cfgM, check.HasLen, 2) - c.Assert(cfgM[source], check.DeepEquals, cfg) - c.Assert(cfgM[cfgExtra.SourceID], check.DeepEquals, &cfgExtra) + s.Require().NoError(err) + s.Require().Equal(rev2, rev3) + s.Require().Len(cfgM, 2) + s.Require().Equal(cfg, cfgM[source]) + s.Require().Equal(&cfgExtra, cfgM[cfgExtra.SourceID]) // delete the config. deleteOp := deleteSourceCfgOp(source) deleteResp, err := etcdTestCli.Txn(context.Background()).Then(deleteOp).Commit() - c.Assert(err, check.IsNil) + s.Require().NoError(err) // get again, not exists now. scm3, rev4, err := GetSourceCfg(etcdTestCli, source, 0) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Equals, deleteResp.Header.Revision) - c.Assert(scm3, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Equal(deleteResp.Header.Revision, rev4) + s.Require().Len(scm3, 0) } diff --git a/dm/pkg/ha/stage_test.go b/dm/pkg/ha/stage_test.go index c377555618..ef97aa9b8e 100644 --- a/dm/pkg/ha/stage_test.go +++ b/dm/pkg/ha/stage_test.go @@ -17,37 +17,36 @@ import ( "context" "time" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/config" "github.com/pingcap/tiflow/dm/pb" ) -func (t *testForEtcd) TestStageJSON(c *check.C) { +func (s *testForEtcd) TestStageJSON() { // stage for relay. rs1 := NewRelayStage(pb.Stage_Running, "mysql-replica-1") j, err := rs1.toJSON() - c.Assert(err, check.IsNil) - c.Assert(j, check.Equals, `{"expect":2,"source":"mysql-replica-1"}`) - c.Assert(j, check.Equals, rs1.String()) + s.Require().NoError(err) + s.Require().Equal(`{"expect":2,"source":"mysql-replica-1"}`, j) + s.Require().Equal(rs1.String(), j) rs2, err := stageFromJSON(j) - c.Assert(err, check.IsNil) - c.Assert(rs2, check.DeepEquals, rs1) + s.Require().NoError(err) + s.Require().Equal(rs1, rs2) // stage for subtask. sts1 := NewSubTaskStage(pb.Stage_Paused, "mysql-replica-1", "task1") j, err = sts1.toJSON() - c.Assert(err, check.IsNil) - c.Assert(j, check.Equals, `{"expect":3,"source":"mysql-replica-1","task":"task1"}`) - c.Assert(j, check.Equals, sts1.String()) + s.Require().NoError(err) + s.Require().Equal(`{"expect":3,"source":"mysql-replica-1","task":"task1"}`, j) + s.Require().Equal(sts1.String(), j) sts2, err := stageFromJSON(j) - c.Assert(err, check.IsNil) - c.Assert(sts2, check.DeepEquals, sts1) + s.Require().NoError(err) + s.Require().Equal(sts1, sts2) } -func (t *testForEtcd) TestRelayStageEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func (s *testForEtcd) TestRelayStageEtcd() { + defer clearTestInfoOperation(s.T()) var ( watchTimeout = 2 * time.Second @@ -57,18 +56,18 @@ func (t *testForEtcd) TestRelayStageEtcd(c *check.C) { stage1 = NewRelayStage(pb.Stage_Running, source1) stage2 = NewRelayStage(pb.Stage_Paused, source2) ) - c.Assert(stage1.IsDeleted, check.IsFalse) + s.Require().False(stage1.IsDeleted) // no relay stage exist. st1, rev1, err := GetRelayStage(etcdTestCli, source1) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) - c.Assert(st1, check.DeepEquals, emptyStage) + s.Require().NoError(err) + s.Require().Greater(rev1, int64(0)) + s.Require().Equal(emptyStage, st1) // put two stage. rev2, err := PutRelayStage(etcdTestCli, stage1, stage2) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + s.Require().NoError(err) + s.Require().Greater(rev2, rev1) // watch the PUT operation for stage1. stageCh := make(chan Stage, 10) @@ -78,32 +77,32 @@ func (t *testForEtcd) TestRelayStageEtcd(c *check.C) { cancel() close(stageCh) close(errCh) - c.Assert(len(stageCh), check.Equals, 1) + s.Require().Equal(1, len(stageCh)) stage1.Revision = rev2 - c.Assert(<-stageCh, check.DeepEquals, stage1) - c.Assert(len(errCh), check.Equals, 0) + s.Require().Equal(stage1, <-stageCh) + s.Require().Equal(0, len(errCh)) // get stage1 back. st2, rev3, err := GetRelayStage(etcdTestCli, source1) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) - c.Assert(st2, check.DeepEquals, stage1) + s.Require().NoError(err) + s.Require().Equal(rev2, rev3) + s.Require().Equal(stage1, st2) // get two stages. stm, rev3, err := GetAllRelayStage(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) - c.Assert(stm, check.HasLen, 2) + s.Require().NoError(err) + s.Require().Equal(rev2, rev3) + s.Require().Len(stm, 2) stage2.Revision = rev2 - c.Assert(stm[source1], check.DeepEquals, stage1) - c.Assert(stm[source2], check.DeepEquals, stage2) + s.Require().Equal(stage1, stm[source1]) + s.Require().Equal(stage2, stm[source2]) // delete stage1. deleteOp := deleteRelayStageOp(source1) resp, err := etcdTestCli.Txn(context.Background()).Then(deleteOp).Commit() - c.Assert(err, check.IsNil) + s.Require().NoError(err) rev4 := resp.Header.Revision - c.Assert(rev4, check.Greater, rev3) + s.Require().Greater(rev4, rev3) // watch the DELETE operation for stage1. stageCh = make(chan Stage, 10) @@ -113,20 +112,20 @@ func (t *testForEtcd) TestRelayStageEtcd(c *check.C) { cancel() close(stageCh) close(errCh) - c.Assert(len(stageCh), check.Equals, 1) + s.Require().Equal(1, len(stageCh)) st3 := <-stageCh - c.Assert(st3.IsDeleted, check.IsTrue) - c.Assert(len(errCh), check.Equals, 0) + s.Require().True(st3.IsDeleted) + s.Require().Equal(0, len(errCh)) // get again, not exists now. st4, rev5, err := GetRelayStage(etcdTestCli, source1) - c.Assert(err, check.IsNil) - c.Assert(rev5, check.Equals, rev4) - c.Assert(st4, check.DeepEquals, emptyStage) + s.Require().NoError(err) + s.Require().Equal(rev4, rev5) + s.Require().Equal(emptyStage, st4) } -func (t *testForEtcd) TestSubTaskStageEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func (s *testForEtcd) TestSubTaskStageEtcd() { + defer clearTestInfoOperation(s.T()) var ( watchTimeout = 2 * time.Second @@ -139,14 +138,14 @@ func (t *testForEtcd) TestSubTaskStageEtcd(c *check.C) { // no stage exists. st1, rev1, err := GetSubTaskStage(etcdTestCli, source, task1) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) - c.Assert(st1, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Greater(rev1, int64(0)) + s.Require().Len(st1, 0) // put two stages. rev2, err := PutSubTaskStage(etcdTestCli, stage1, stage2) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + s.Require().NoError(err) + s.Require().Greater(rev2, rev1) // watch the PUT operation for stages. stageCh := make(chan Stage, 10) @@ -156,41 +155,41 @@ func (t *testForEtcd) TestSubTaskStageEtcd(c *check.C) { cancel() close(stageCh) close(errCh) - c.Assert(len(stageCh), check.Equals, 2) + s.Require().Equal(2, len(stageCh)) stage1.Revision = rev2 stage2.Revision = rev2 - c.Assert(<-stageCh, check.DeepEquals, stage1) - c.Assert(<-stageCh, check.DeepEquals, stage2) - c.Assert(len(errCh), check.Equals, 0) + s.Require().Equal(stage1, <-stageCh) + s.Require().Equal(stage2, <-stageCh) + s.Require().Equal(0, len(errCh)) // get stages back without specified task. stm, rev3, err := GetSubTaskStage(etcdTestCli, source, "") - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) - c.Assert(stm, check.HasLen, 2) - c.Assert(stm[task1], check.DeepEquals, stage1) - c.Assert(stm[task2], check.DeepEquals, stage2) + s.Require().NoError(err) + s.Require().Equal(rev2, rev3) + s.Require().Len(stm, 2) + s.Require().Equal(stage1, stm[task1]) + s.Require().Equal(stage2, stm[task2]) // get the stage back with specified task. stm, rev3, err = GetSubTaskStage(etcdTestCli, source, task1) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) - c.Assert(stm, check.HasLen, 1) - c.Assert(stm[task1], check.DeepEquals, stage1) + s.Require().NoError(err) + s.Require().Equal(rev2, rev3) + s.Require().Len(stm, 1) + s.Require().Equal(stage1, stm[task1]) // get all stages. stmm, rev3, err := GetAllSubTaskStage(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) - c.Assert(stmm, check.HasLen, 1) - c.Assert(stmm[source], check.HasLen, 2) - c.Assert(stmm[source][task1], check.DeepEquals, stage1) - c.Assert(stmm[source][task2], check.DeepEquals, stage2) + s.Require().NoError(err) + s.Require().Equal(rev2, rev3) + s.Require().Len(stmm, 1) + s.Require().Len(stmm[source], 2) + s.Require().Equal(stage1, stmm[source][task1]) + s.Require().Equal(stage2, stmm[source][task2]) // delete two stages. rev4, err := DeleteSubTaskStage(etcdTestCli, stage1, stage2) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Greater, rev3) + s.Require().NoError(err) + s.Require().Greater(rev4, rev3) // watch the DELETE operation for stages. stageCh = make(chan Stage, 10) @@ -200,49 +199,49 @@ func (t *testForEtcd) TestSubTaskStageEtcd(c *check.C) { cancel() close(stageCh) close(errCh) - c.Assert(len(stageCh), check.Equals, 2) + s.Require().Equal(2, len(stageCh)) for st2 := range stageCh { - c.Assert(st2.IsDeleted, check.IsTrue) + s.Require().True(st2.IsDeleted) } - c.Assert(len(errCh), check.Equals, 0) + s.Require().Equal(0, len(errCh)) // get again, not exists now. stm, rev5, err := GetSubTaskStage(etcdTestCli, source, task1) - c.Assert(err, check.IsNil) - c.Assert(rev5, check.Equals, rev4) - c.Assert(stm, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Equal(rev4, rev5) + s.Require().Len(stm, 0) } -func (t *testForEtcd) TestGetSubTaskStageConfigEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func (s *testForEtcd) TestGetSubTaskStageConfigEtcd() { + defer clearTestInfoOperation(s.T()) cfg := config.SubTaskConfig{} - c.Assert(cfg.Decode(config.SampleSubtaskConfig, true), check.IsNil) + s.Require().NoError(cfg.Decode(config.SampleSubtaskConfig, true)) source := cfg.SourceID task := cfg.Name stage := NewSubTaskStage(pb.Stage_Running, source, task) // no subtask stage and config stm, validatorM, scm, rev1, err := GetSubTaskStageConfig(etcdTestCli, source) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) - c.Assert(stm, check.HasLen, 0) - c.Assert(validatorM, check.HasLen, 0) - c.Assert(scm, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Greater(rev1, int64(0)) + s.Require().Len(stm, 0) + s.Require().Len(validatorM, 0) + s.Require().Len(scm, 0) // put subtask config and stage at the same time rev2, err := PutSubTaskCfgStage(etcdTestCli, []config.SubTaskConfig{cfg}, []Stage{stage}, []Stage{stage}) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + s.Require().NoError(err) + s.Require().Greater(rev2, rev1) // get subtask config and stage at the same time stm, validatorM, scm, rev3, err := GetSubTaskStageConfig(etcdTestCli, source) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) - c.Assert(stm, check.HasLen, 1) - c.Assert(validatorM, check.HasLen, 1) + s.Require().NoError(err) + s.Require().Equal(rev2, rev3) + s.Require().Len(stm, 1) + s.Require().Len(validatorM, 1) stage.Revision = rev2 - c.Assert(stm[task], check.DeepEquals, stage) - c.Assert(validatorM[task], check.DeepEquals, stage) - c.Assert(scm[task], check.DeepEquals, cfg) + s.Require().Equal(stage, stm[task]) + s.Require().Equal(stage, validatorM[task]) + s.Require().Equal(cfg, scm[task]) } diff --git a/dm/pkg/ha/subtask_test.go b/dm/pkg/ha/subtask_test.go index f0c3f9029c..a5deca0e3a 100644 --- a/dm/pkg/ha/subtask_test.go +++ b/dm/pkg/ha/subtask_test.go @@ -16,15 +16,14 @@ package ha import ( "context" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/config" ) -func (t *testForEtcd) TestSubTaskEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func (s *testForEtcd) TestSubTaskEtcd() { + defer clearTestInfoOperation(s.T()) cfg1 := config.SubTaskConfig{} - c.Assert(cfg1.Decode(config.SampleSubtaskConfig, true), check.IsNil) + s.Require().NoError(cfg1.Decode(config.SampleSubtaskConfig, true)) source := cfg1.SourceID taskName1 := cfg1.Name @@ -32,76 +31,76 @@ func (t *testForEtcd) TestSubTaskEtcd(c *check.C) { cfg2 := cfg1 cfg2.Name = taskName2 err := cfg2.Adjust(true) - c.Assert(err, check.IsNil) + s.Require().NoError(err) // no subtask config exist. tsm1, rev1, err := GetSubTaskCfg(etcdTestCli, source, taskName1, 0) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) - c.Assert(tsm1, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Greater(rev1, int64(0)) + s.Require().Len(tsm1, 0) // put subtask configs. rev2, err := PutSubTaskCfgStage(etcdTestCli, []config.SubTaskConfig{cfg1, cfg2}, []Stage{}, nil) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + s.Require().NoError(err) + s.Require().Greater(rev2, rev1) // get single config back. tsm2, rev3, err := GetSubTaskCfg(etcdTestCli, source, taskName1, 0) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) - c.Assert(tsm2, check.HasLen, 1) - c.Assert(tsm2, check.HasKey, taskName1) - c.Assert(tsm2[taskName1], check.DeepEquals, cfg1) + s.Require().NoError(err) + s.Require().Equal(rev2, rev3) + s.Require().Len(tsm2, 1) + s.Require().Contains(tsm2, taskName1) + s.Require().Equal(cfg1, tsm2[taskName1]) tsm3, rev4, err := GetSubTaskCfg(etcdTestCli, source, "", 0) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Equals, rev3) - c.Assert(tsm3, check.HasLen, 2) - c.Assert(tsm3, check.HasKey, taskName1) - c.Assert(tsm3, check.HasKey, taskName2) - c.Assert(tsm3[taskName1], check.DeepEquals, cfg1) - c.Assert(tsm3[taskName2], check.DeepEquals, cfg2) + s.Require().NoError(err) + s.Require().Equal(rev3, rev4) + s.Require().Len(tsm3, 2) + s.Require().Contains(tsm3, taskName1) + s.Require().Contains(tsm3, taskName2) + s.Require().Equal(cfg1, tsm3[taskName1]) + s.Require().Equal(cfg2, tsm3[taskName2]) // get all subtask configs. stmm, rev4, err := GetAllSubTaskCfg(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Equals, rev3) - c.Assert(stmm, check.HasLen, 1) - c.Assert(stmm[source], check.HasLen, 2) - c.Assert(stmm[source][taskName1], check.DeepEquals, cfg1) - c.Assert(stmm[source][taskName2], check.DeepEquals, cfg2) + s.Require().NoError(err) + s.Require().Equal(rev3, rev4) + s.Require().Len(stmm, 1) + s.Require().Len(stmm[source], 2) + s.Require().Equal(cfg1, stmm[source][taskName1]) + s.Require().Equal(cfg2, stmm[source][taskName2]) // delete the config. deleteOps := deleteSubTaskCfgOp(cfg1) _, err = etcdTestCli.Txn(context.Background()).Then(deleteOps...).Commit() - c.Assert(err, check.IsNil) + s.Require().NoError(err) deleteOps = deleteSubTaskCfgOp(cfg2) deleteResp, err := etcdTestCli.Txn(context.Background()).Then(deleteOps...).Commit() - c.Assert(err, check.IsNil) + s.Require().NoError(err) // get again, not exists now. tsm4, rev5, err := GetSubTaskCfg(etcdTestCli, source, taskName1, 0) - c.Assert(err, check.IsNil) - c.Assert(rev5, check.Equals, deleteResp.Header.Revision) - c.Assert(tsm4, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Equal(deleteResp.Header.Revision, rev5) + s.Require().Len(tsm4, 0) // put subtask config. rev6, err := PutSubTaskCfgStage(etcdTestCli, []config.SubTaskConfig{cfg1}, []Stage{}, nil) - c.Assert(err, check.IsNil) - c.Assert(rev6, check.Greater, int64(0)) + s.Require().NoError(err) + s.Require().Greater(rev6, int64(0)) // update subtask config. cfg3 := cfg1 cfg3.SourceID = "testForRevision" rev7, err := PutSubTaskCfgStage(etcdTestCli, []config.SubTaskConfig{cfg3}, []Stage{}, nil) - c.Assert(err, check.IsNil) - c.Assert(rev7, check.Greater, rev6) + s.Require().NoError(err) + s.Require().Greater(rev7, rev6) // get subtask from rev6. shoule be equal to cfg1 tsm5, rev8, err := GetSubTaskCfg(etcdTestCli, source, taskName1, rev6) - c.Assert(err, check.IsNil) - c.Assert(rev8, check.Equals, rev7) - c.Assert(tsm5, check.HasLen, 1) - c.Assert(tsm5, check.HasKey, taskName1) - c.Assert(tsm5[taskName1], check.DeepEquals, cfg1) + s.Require().NoError(err) + s.Require().Equal(rev7, rev8) + s.Require().Len(tsm5, 1) + s.Require().Contains(tsm5, taskName1) + s.Require().Equal(cfg1, tsm5[taskName1]) } diff --git a/dm/pkg/ha/task_cli_args_test.go b/dm/pkg/ha/task_cli_args_test.go index 6d6652d59a..998d19c195 100644 --- a/dm/pkg/ha/task_cli_args_test.go +++ b/dm/pkg/ha/task_cli_args_test.go @@ -14,12 +14,11 @@ package ha import ( - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/config" ) -func (t *testForEtcd) TestTaskCliArgs(c *check.C) { - defer clearTestInfoOperation(c) +func (s *testForEtcd) TestTaskCliArgs() { + defer clearTestInfoOperation(s.T()) task := "test-task-cli-args" source1 := "source1" @@ -27,8 +26,8 @@ func (t *testForEtcd) TestTaskCliArgs(c *check.C) { checkNotExist := func(source string) { ret, err := GetTaskCliArgs(etcdTestCli, task, source) - c.Assert(err, check.IsNil) - c.Assert(ret, check.IsNil) + s.Require().NoError(err) + s.Require().Nil(ret) } checkNotExist(source1) @@ -38,40 +37,40 @@ func (t *testForEtcd) TestTaskCliArgs(c *check.C) { StartTime: "123", } err := PutTaskCliArgs(etcdTestCli, task, []string{source1}, args) - c.Assert(err, check.IsNil) + s.Require().NoError(err) ret, err := GetTaskCliArgs(etcdTestCli, task, source1) - c.Assert(err, check.IsNil) - c.Assert(ret, check.NotNil) - c.Assert(*ret, check.Equals, args) + s.Require().NoError(err) + s.Require().NotNil(ret) + s.Require().Equal(args, *ret) checkNotExist(source2) // put will overwrite args.StartTime = "456" err = PutTaskCliArgs(etcdTestCli, task, []string{source1, source2}, args) - c.Assert(err, check.IsNil) + s.Require().NoError(err) ret, err = GetTaskCliArgs(etcdTestCli, task, source1) - c.Assert(err, check.IsNil) - c.Assert(ret, check.NotNil) - c.Assert(*ret, check.Equals, args) + s.Require().NoError(err) + s.Require().NotNil(ret) + s.Require().Equal(args, *ret) ret, err = GetTaskCliArgs(etcdTestCli, task, source2) - c.Assert(err, check.IsNil) - c.Assert(ret, check.NotNil) - c.Assert(*ret, check.Equals, args) + s.Require().NoError(err) + s.Require().NotNil(ret) + s.Require().Equal(args, *ret) // test delete one source err = DeleteTaskCliArgs(etcdTestCli, task, []string{source1}) - c.Assert(err, check.IsNil) + s.Require().NoError(err) checkNotExist(source1) ret, err = GetTaskCliArgs(etcdTestCli, task, source2) - c.Assert(err, check.IsNil) - c.Assert(ret, check.NotNil) - c.Assert(*ret, check.Equals, args) + s.Require().NoError(err) + s.Require().NotNil(ret) + s.Require().Equal(args, *ret) // test delete all source err = DeleteAllTaskCliArgs(etcdTestCli, task) - c.Assert(err, check.IsNil) + s.Require().NoError(err) checkNotExist(source2) } diff --git a/dm/pkg/ha/worker_test.go b/dm/pkg/ha/worker_test.go index a11aa0953b..e2b4bc7d5d 100644 --- a/dm/pkg/ha/worker_test.go +++ b/dm/pkg/ha/worker_test.go @@ -13,25 +13,21 @@ package ha -import ( - "github.com/pingcap/check" -) - -func (t *testForEtcd) TestWorkerInfoJSON(c *check.C) { +func (s *testForEtcd) TestWorkerInfoJSON() { i1 := NewWorkerInfo("dm-worker-1", "192.168.0.100:8262") j, err := i1.toJSON() - c.Assert(err, check.IsNil) - c.Assert(j, check.Equals, `{"name":"dm-worker-1","addr":"192.168.0.100:8262"}`) - c.Assert(j, check.Equals, i1.String()) + s.Require().NoError(err) + s.Require().Equal(`{"name":"dm-worker-1","addr":"192.168.0.100:8262"}`, j) + s.Require().Equal(i1.String(), j) i2, err := workerInfoFromJSON(j) - c.Assert(err, check.IsNil) - c.Assert(i2, check.DeepEquals, i1) + s.Require().NoError(err) + s.Require().Equal(i1, i2) } -func (t *testForEtcd) TestWorkerInfoEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func (s *testForEtcd) TestWorkerInfoEtcd() { + defer clearTestInfoOperation(s.T()) var ( worker1 = "dm-worker-1" @@ -42,34 +38,34 @@ func (t *testForEtcd) TestWorkerInfoEtcd(c *check.C) { // get without info. ifm, _, err := GetAllWorkerInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(ifm, check.HasLen, 0) + s.Require().NoError(err) + s.Require().Len(ifm, 0) // put two info. rev1, err := PutWorkerInfo(etcdTestCli, info1) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) + s.Require().NoError(err) + s.Require().Greater(rev1, int64(0)) rev2, err := PutWorkerInfo(etcdTestCli, info2) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + s.Require().NoError(err) + s.Require().Greater(rev2, rev1) // get again, with two info. ifm, rev3, err := GetAllWorkerInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) - c.Assert(ifm, check.HasLen, 2) - c.Assert(ifm[worker1], check.DeepEquals, info1) - c.Assert(ifm[worker2], check.DeepEquals, info2) + s.Require().NoError(err) + s.Require().Equal(rev2, rev3) + s.Require().Len(ifm, 2) + s.Require().Equal(info1, ifm[worker1]) + s.Require().Equal(info2, ifm[worker2]) // delete info1. rev4, err := DeleteWorkerInfoRelayConfig(etcdTestCli, worker1) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Greater, rev3) + s.Require().NoError(err) + s.Require().Greater(rev4, rev3) // get again, with only one info. ifm, rev5, err := GetAllWorkerInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev5, check.Equals, rev4) - c.Assert(ifm, check.HasLen, 1) - c.Assert(ifm[worker2], check.DeepEquals, info2) + s.Require().NoError(err) + s.Require().Equal(rev4, rev5) + s.Require().Len(ifm, 1) + s.Require().Equal(info2, ifm[worker2]) } diff --git a/dm/pkg/shardddl/optimism/column_test.go b/dm/pkg/shardddl/optimism/column_test.go index ab11f03839..744e27402f 100644 --- a/dm/pkg/shardddl/optimism/column_test.go +++ b/dm/pkg/shardddl/optimism/column_test.go @@ -14,15 +14,13 @@ package optimism import ( - "github.com/pingcap/check" -) - -type testColumn struct{} + "testing" -var _ = check.Suite(&testColumn{}) + "github.com/stretchr/testify/require" +) -func (t *testColumn) TestColumnETCD(c *check.C) { - defer clearTestInfoOperation(c) +func TestColumnETCD(t *testing.T) { + defer clearTestInfoOperation(t) var ( task = "test" @@ -38,24 +36,24 @@ func (t *testColumn) TestColumnETCD(c *check.C) { lockID = genDDLLockID(info1) ) rev1, putted, err := PutDroppedColumns(etcdTestCli, lockID, source1, upSchema1, upTable1, []string{"a"}, DropNotDone) - c.Assert(err, check.IsNil) - c.Assert(putted, check.IsTrue) + require.NoError(t, err) + require.True(t, putted) rev2, putted, err := PutDroppedColumns(etcdTestCli, lockID, source1, upSchema1, upTable1, []string{"b"}, DropNotDone) - c.Assert(err, check.IsNil) - c.Assert(putted, check.IsTrue) - c.Assert(rev2, check.Greater, rev1) + require.NoError(t, err) + require.True(t, putted) + require.Greater(t, rev2, rev1) rev3, putted, err := PutDroppedColumns(etcdTestCli, lockID, source1, upSchema2, upTable2, []string{"b"}, DropNotDone) - c.Assert(err, check.IsNil) - c.Assert(putted, check.IsTrue) - c.Assert(rev3, check.Greater, rev2) + require.NoError(t, err) + require.True(t, putted) + require.Greater(t, rev3, rev2) rev4, putted, err := PutDroppedColumns(etcdTestCli, lockID, source2, upSchema1, upTable1, []string{"b"}, DropNotDone) - c.Assert(err, check.IsNil) - c.Assert(putted, check.IsTrue) - c.Assert(rev4, check.Greater, rev3) + require.NoError(t, err) + require.True(t, putted) + require.Greater(t, rev4, rev3) rev5, putted, err := PutDroppedColumns(etcdTestCli, lockID, source2, upSchema1, upTable1, []string{"b", "c"}, DropNotDone) - c.Assert(err, check.IsNil) - c.Assert(putted, check.IsTrue) - c.Assert(rev5, check.Greater, rev4) + require.NoError(t, err) + require.True(t, putted) + require.Greater(t, rev5, rev4) expectedColm := map[string]map[string]map[string]map[string]map[string]DropColumnStage{ lockID: { @@ -73,19 +71,19 @@ func (t *testColumn) TestColumnETCD(c *check.C) { }, } colm, rev6, err := GetAllDroppedColumns(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(colm, check.DeepEquals, expectedColm) - c.Assert(rev6, check.Equals, rev5) + require.NoError(t, err) + require.Equal(t, expectedColm, colm) + require.Equal(t, rev5, rev6) rev7, deleted, err := DeleteDroppedColumns(etcdTestCli, lockID, "b", "c") - c.Assert(err, check.IsNil) - c.Assert(deleted, check.IsTrue) - c.Assert(rev7, check.Greater, rev6) + require.NoError(t, err) + require.True(t, deleted) + require.Greater(t, rev7, rev6) delete(expectedColm[lockID], "b") delete(expectedColm[lockID], "c") colm, rev8, err := GetAllDroppedColumns(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(colm, check.DeepEquals, expectedColm) - c.Assert(rev8, check.Equals, rev7) + require.NoError(t, err) + require.Equal(t, expectedColm, colm) + require.Equal(t, rev7, rev8) } diff --git a/dm/pkg/shardddl/optimism/info_test.go b/dm/pkg/shardddl/optimism/info_test.go index 77768f5385..59a4454b78 100644 --- a/dm/pkg/shardddl/optimism/info_test.go +++ b/dm/pkg/shardddl/optimism/info_test.go @@ -16,11 +16,12 @@ package optimism import ( "context" "encoding/json" + "flag" + "os" "sync" "testing" "time" - "github.com/pingcap/check" tiddl "github.com/pingcap/tidb/pkg/ddl" "github.com/pingcap/tidb/pkg/meta/model" "github.com/pingcap/tidb/pkg/parser" @@ -29,48 +30,48 @@ import ( "github.com/pingcap/tidb/pkg/util/mock" "github.com/pingcap/tiflow/dm/common" "github.com/pingcap/tiflow/dm/pkg/etcdutil" + "github.com/stretchr/testify/require" clientv3 "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/tests/v3/integration" ) var etcdTestCli *clientv3.Client -func TestInfo(t *testing.T) { - integration.BeforeTestExternal(t) - mockCluster := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}) - defer mockCluster.Terminate(t) - +func TestMain(m *testing.M) { + // integration.NewClusterV3 consults testing.Short, which panics if + // called before the testing flags are parsed. + flag.Parse() + mockCluster := integration.NewClusterV3(&testing.T{}, &integration.ClusterConfig{Size: 1}) etcdTestCli = mockCluster.RandClient() - check.TestingT(t) + code := m.Run() + + mockCluster.Terminate(&testing.T{}) + os.Exit(code) } // clear keys in etcd test cluster. -func clearTestInfoOperation(c *check.C) { - c.Assert(ClearTestInfoOperationColumn(etcdTestCli), check.IsNil) +func clearTestInfoOperation(t *testing.T) { + require.NoError(t, ClearTestInfoOperationColumn(etcdTestCli)) } -func createTableInfo(c *check.C, p *parser.Parser, se sessionctx.Context, tableID int64, sql string) *model.TableInfo { +func createTableInfo(t *testing.T, p *parser.Parser, se sessionctx.Context, tableID int64, sql string) *model.TableInfo { node, err := p.ParseOneStmt(sql, "utf8mb4", "utf8mb4_bin") if err != nil { - c.Fatalf("fail to parse stmt, %v", err) + t.Fatalf("fail to parse stmt, %v", err) } createStmtNode, ok := node.(*ast.CreateTableStmt) if !ok { - c.Fatalf("%s is not a CREATE TABLE statement", sql) + t.Fatalf("%s is not a CREATE TABLE statement", sql) } info, err := tiddl.MockTableInfo(se, createStmtNode, tableID) if err != nil { - c.Fatalf("fail to create table info, %v", err) + t.Fatalf("fail to create table info, %v", err) } return info } -type testForEtcd struct{} - -var _ = check.Suite(&testForEtcd{}) - -func (t *testForEtcd) TestInfoJSON(c *check.C) { +func TestInfoJSON(t *testing.T) { i1 := NewInfo("test", "mysql-replica-1", "db-1", "tbl-1", "db", "tbl", []string{ "ALTER TABLE tbl ADD COLUMN c1 INT", @@ -78,19 +79,19 @@ func (t *testForEtcd) TestInfoJSON(c *check.C) { }, nil, nil) j, err := i1.toJSON() - c.Assert(err, check.IsNil) - c.Assert(j, check.Equals, `{"task":"test","source":"mysql-replica-1","up-schema":"db-1","up-table":"tbl-1","down-schema":"db","down-table":"tbl","ddls":["ALTER TABLE tbl ADD COLUMN c1 INT","ALTER TABLE tbl ADD COLUMN c2 INT"],"table-info-before":null,"table-info-after":null,"ignore-conflict":false}`) - c.Assert(j, check.Equals, i1.String()) + require.NoError(t, err) + require.Equal(t, `{"task":"test","source":"mysql-replica-1","up-schema":"db-1","up-table":"tbl-1","down-schema":"db","down-table":"tbl","ddls":["ALTER TABLE tbl ADD COLUMN c1 INT","ALTER TABLE tbl ADD COLUMN c2 INT"],"table-info-before":null,"table-info-after":null,"ignore-conflict":false}`, j) + require.Equal(t, i1.String(), j) j = i1.ShortString() - c.Assert(j, check.Equals, `{"task":"test","source":"mysql-replica-1","up-schema":"db-1","up-table":"tbl-1","down-schema":"db","down-table":"tbl","ddls":["ALTER TABLE tbl ADD COLUMN c1 INT","ALTER TABLE tbl ADD COLUMN c2 INT"],"table-before":"","table-after":"","is-deleted":false,"version":0,"revision":0,"ignore-conflict":false}`) + require.Equal(t, `{"task":"test","source":"mysql-replica-1","up-schema":"db-1","up-table":"tbl-1","down-schema":"db","down-table":"tbl","ddls":["ALTER TABLE tbl ADD COLUMN c1 INT","ALTER TABLE tbl ADD COLUMN c2 INT"],"table-before":"","table-after":"","is-deleted":false,"version":0,"revision":0,"ignore-conflict":false}`, j) i2, err := infoFromJSON(j) - c.Assert(err, check.IsNil) - c.Assert(i2, check.DeepEquals, i1) + require.NoError(t, err) + require.Equal(t, i1, i2) } -func (t *testForEtcd) TestEtcdInfoUpgrade(c *check.C) { - defer clearTestInfoOperation(c) +func TestEtcdInfoUpgrade(t *testing.T) { + defer clearTestInfoOperation(t) var ( source1 = "mysql-replica-1" @@ -104,10 +105,10 @@ func (t *testForEtcd) TestEtcdInfoUpgrade(c *check.C) { p = parser.New() se = mock.NewContext() tblID int64 = 222 - tblI1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - tblI2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) - tblI3 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 INT)`) - tblI4 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 INT, c3 INT)`) + tblI1 = createTableInfo(t, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + tblI2 = createTableInfo(t, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) + tblI3 = createTableInfo(t, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 INT)`) + tblI4 = createTableInfo(t, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 INT, c3 INT)`) i11 = NewInfo(task1, source1, upSchema, upTable, downSchema, downTable, []string{"ALTER TABLE bar ADD COLUMN c1 INT"}, tblI1, []*model.TableInfo{tblI2}) i12 = NewInfo(task1, source2, upSchema, upTable, downSchema, downTable, []string{"ALTER TABLE bar ADD COLUMN c2 INT"}, tblI2, []*model.TableInfo{tblI3}) i21 = NewInfo(task2, source1, upSchema, upTable, downSchema, downTable, []string{"ALTER TABLE bar ADD COLUMN c3 INT"}, tblI3, []*model.TableInfo{tblI4}) @@ -118,27 +119,27 @@ func (t *testForEtcd) TestEtcdInfoUpgrade(c *check.C) { // put the oldInfo rev1, err := putOldInfo(etcdTestCli, oi11) - c.Assert(err, check.IsNil) + require.NoError(t, err) rev2, err := putOldInfo(etcdTestCli, oi11) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + require.NoError(t, err) + require.Greater(t, rev2, rev1) // put another key and get again with 2 info. rev3, err := putOldInfo(etcdTestCli, oi12) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Greater, rev2) + require.NoError(t, err) + require.Greater(t, rev3, rev2) // get all infos. ifm, rev4, err := GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Equals, rev3) - c.Assert(ifm, check.HasLen, 1) - c.Assert(ifm, check.HasKey, task1) - c.Assert(ifm[task1], check.HasLen, 2) - c.Assert(ifm[task1][source1], check.HasLen, 1) - c.Assert(ifm[task1][source1][upSchema], check.HasLen, 1) - c.Assert(ifm[task1][source2], check.HasLen, 1) - c.Assert(ifm[task1][source2][upSchema], check.HasLen, 1) + require.NoError(t, err) + require.Equal(t, rev3, rev4) + require.Len(t, ifm, 1) + require.Contains(t, ifm, task1) + require.Len(t, ifm[task1], 2) + require.Len(t, ifm[task1][source1], 1) + require.Len(t, ifm[task1][source1][upSchema], 1) + require.Len(t, ifm[task1][source2], 1) + require.Len(t, ifm[task1][source2][upSchema], 1) i11WithVer := i11 i11WithVer.Version = 2 @@ -146,8 +147,8 @@ func (t *testForEtcd) TestEtcdInfoUpgrade(c *check.C) { i12WithVer := i12 i12WithVer.Version = 1 i12WithVer.Revision = rev4 - c.Assert(ifm[task1][source1][upSchema][upTable], check.DeepEquals, i11WithVer) - c.Assert(ifm[task1][source2][upSchema][upTable], check.DeepEquals, i12WithVer) + require.Equal(t, i11WithVer, ifm[task1][source1][upSchema][upTable]) + require.Equal(t, i12WithVer, ifm[task1][source2][upSchema][upTable]) // start the watcher. wch := make(chan Info, 10) @@ -165,17 +166,17 @@ func (t *testForEtcd) TestEtcdInfoUpgrade(c *check.C) { // version start from 1 // simulate v2.0.1 worker and v2.0.2 master rev5, err := putOldInfo(etcdTestCli, oi21) - c.Assert(err, check.IsNil) + require.NoError(t, err) infoWithVer := <-wch i21WithVer := i21 i21WithVer.Version = 1 i21WithVer.Revision = rev5 - c.Assert(infoWithVer, check.DeepEquals, i21WithVer) - c.Assert(len(ech), check.Equals, 0) + require.Equal(t, i21WithVer, infoWithVer) + require.Equal(t, 0, len(ech)) } -func (t *testForEtcd) TestInfoEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func TestInfoEtcd(t *testing.T) { + defer clearTestInfoOperation(t) var ( watchTimeout = 2 * time.Second @@ -190,10 +191,10 @@ func (t *testForEtcd) TestInfoEtcd(c *check.C) { p = parser.New() se = mock.NewContext() tblID int64 = 222 - tblI1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - tblI2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) - tblI3 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 INT)`) - tblI4 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 INT, c3 INT)`) + tblI1 = createTableInfo(t, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + tblI2 = createTableInfo(t, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) + tblI3 = createTableInfo(t, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 INT)`) + tblI4 = createTableInfo(t, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 INT, c3 INT)`) i11 = NewInfo(task1, source1, upSchema, upTable, downSchema, downTable, []string{"ALTER TABLE bar ADD COLUMN c1 INT"}, tblI1, []*model.TableInfo{tblI2}) i12 = NewInfo(task1, source2, upSchema, upTable, downSchema, downTable, []string{"ALTER TABLE bar ADD COLUMN c2 INT"}, tblI2, []*model.TableInfo{tblI3}) i21 = NewInfo(task2, source1, upSchema, upTable, downSchema, downTable, []string{"ALTER TABLE bar ADD COLUMN c3 INT"}, tblI3, []*model.TableInfo{tblI4}) @@ -201,38 +202,38 @@ func (t *testForEtcd) TestInfoEtcd(c *check.C) { // put the same key twice. rev1, err := PutInfo(etcdTestCli, i11) - c.Assert(err, check.IsNil) + require.NoError(t, err) rev2, err := PutInfo(etcdTestCli, i11) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + require.NoError(t, err) + require.Greater(t, rev2, rev1) // get with only 1 info. ifm, rev3, err := GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) - c.Assert(ifm, check.HasLen, 1) - c.Assert(ifm, check.HasKey, task1) - c.Assert(ifm[task1], check.HasLen, 1) - c.Assert(ifm[task1][source1], check.HasLen, 1) - c.Assert(ifm[task1][source1][upSchema], check.HasLen, 1) + require.NoError(t, err) + require.Equal(t, rev2, rev3) + require.Len(t, ifm, 1) + require.Contains(t, ifm, task1) + require.Len(t, ifm[task1], 1) + require.Len(t, ifm[task1][source1], 1) + require.Len(t, ifm[task1][source1][upSchema], 1) i11WithVer := i11 i11WithVer.Version = 2 i11WithVer.Revision = rev2 - c.Assert(ifm[task1][source1][upSchema][upTable], check.DeepEquals, i11WithVer) + require.Equal(t, i11WithVer, ifm[task1][source1][upSchema][upTable]) // put another key and get again with 2 info. rev4, err := PutInfo(etcdTestCli, i12) - c.Assert(err, check.IsNil) + require.NoError(t, err) ifm, _, err = GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(ifm, check.HasLen, 1) - c.Assert(ifm, check.HasKey, task1) - c.Assert(ifm[task1], check.HasLen, 2) - c.Assert(ifm[task1][source1][upSchema][upTable], check.DeepEquals, i11WithVer) + require.NoError(t, err) + require.Len(t, ifm, 1) + require.Contains(t, ifm, task1) + require.Len(t, ifm[task1], 2) + require.Equal(t, i11WithVer, ifm[task1][source1][upSchema][upTable]) i12WithVer := i12 i12WithVer.Version = 1 i12WithVer.Revision = rev4 - c.Assert(ifm[task1][source2][upSchema][upTable], check.DeepEquals, i12WithVer) + require.Equal(t, i12WithVer, ifm[task1][source2][upSchema][upTable]) // start the watcher. wch := make(chan Info, 10) @@ -249,44 +250,44 @@ func (t *testForEtcd) TestInfoEtcd(c *check.C) { // put another key for a different task. // version start from 1 rev5, err := PutInfo(etcdTestCli, i21) - c.Assert(err, check.IsNil) + require.NoError(t, err) infoWithVer := <-wch i21WithVer := i21 i21WithVer.Version = 1 i21WithVer.Revision = rev5 - c.Assert(infoWithVer, check.DeepEquals, i21WithVer) - c.Assert(len(ech), check.Equals, 0) + require.Equal(t, i21WithVer, infoWithVer) + require.Equal(t, 0, len(ech)) // put again // version increase rev6, err := PutInfo(etcdTestCli, i21) - c.Assert(err, check.IsNil) + require.NoError(t, err) infoWithVer = <-wch i21WithVer.Version++ i21WithVer.Revision = rev6 - c.Assert(infoWithVer, check.DeepEquals, i21WithVer) - c.Assert(len(ech), check.Equals, 0) + require.Equal(t, i21WithVer, infoWithVer) + require.Equal(t, 0, len(ech)) // delete i21. deleteOp := deleteInfoOp(i21) resp, err := etcdTestCli.Txn(context.Background()).Then(deleteOp).Commit() - c.Assert(err, check.IsNil) - c.Assert(resp.Succeeded, check.IsTrue) + require.NoError(t, err) + require.True(t, resp.Succeeded) select { case err2 := <-ech: - c.Fatal(err2) + t.Fatal(err2) case <-wch: } // put again // version reset to 1 rev7, err := PutInfo(etcdTestCli, i21) - c.Assert(err, check.IsNil) + require.NoError(t, err) infoWithVer = <-wch i21WithVer.Version = 1 i21WithVer.Revision = rev7 - c.Assert(infoWithVer, check.DeepEquals, i21WithVer) - c.Assert(len(ech), check.Equals, 0) + require.Equal(t, i21WithVer, infoWithVer) + require.Equal(t, 0, len(ech)) watchCancel() wg.Wait() @@ -296,20 +297,20 @@ func (t *testForEtcd) TestInfoEtcd(c *check.C) { // delete i12. deleteOp = deleteInfoOp(i12) resp, err = etcdTestCli.Txn(context.Background()).Then(deleteOp).Commit() - c.Assert(err, check.IsNil) + require.NoError(t, err) // get again. ifm, _, err = GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(ifm, check.HasLen, 2) - c.Assert(ifm, check.HasKey, task1) - c.Assert(ifm, check.HasKey, task2) - c.Assert(ifm[task1], check.HasLen, 1) + require.NoError(t, err) + require.Len(t, ifm, 2) + require.Contains(t, ifm, task1) + require.Contains(t, ifm, task2) + require.Len(t, ifm[task1], 1) i11WithVer.Revision = ifm[task1][source1][upSchema][upTable].Revision - c.Assert(ifm[task1][source1][upSchema][upTable], check.DeepEquals, i11WithVer) - c.Assert(ifm[task2], check.HasLen, 1) + require.Equal(t, i11WithVer, ifm[task1][source1][upSchema][upTable]) + require.Len(t, ifm[task2], 1) i21WithVer.Revision = ifm[task2][source1][upSchema][upTable].Revision - c.Assert(ifm[task2][source1][upSchema][upTable], check.DeepEquals, i21WithVer) + require.Equal(t, i21WithVer, ifm[task2][source1][upSchema][upTable]) // watch the deletion for i12. wch = make(chan Info, 10) @@ -319,12 +320,12 @@ func (t *testForEtcd) TestInfoEtcd(c *check.C) { cancel() close(wch) close(ech) - c.Assert(len(wch), check.Equals, 1) + require.Equal(t, 1, len(wch)) info := <-wch i12c := i12 i12c.IsDeleted = true - c.Assert(info, check.DeepEquals, i12c) - c.Assert(len(ech), check.Equals, 0) + require.Equal(t, i12c, info) + require.Equal(t, 0, len(ech)) } func newOldInfo(task, source, upSchema, upTable, downSchema, downTable string, diff --git a/dm/pkg/shardddl/optimism/keeper_test.go b/dm/pkg/shardddl/optimism/keeper_test.go index 246566c5c8..180fdc0d2c 100644 --- a/dm/pkg/shardddl/optimism/keeper_test.go +++ b/dm/pkg/shardddl/optimism/keeper_test.go @@ -16,31 +16,16 @@ package optimism import ( "testing" - "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/meta/model" "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/util/mock" "github.com/pingcap/tiflow/dm/config/dbconfig" "github.com/pingcap/tiflow/dm/pkg/conn" "github.com/pingcap/tiflow/dm/pkg/terror" - "go.etcd.io/etcd/tests/v3/integration" + "github.com/stretchr/testify/require" ) -type testKeeper struct{} - -var _ = check.Suite(&testKeeper{}) - -func TestKeeper(t *testing.T) { - integration.BeforeTestExternal(t) - mockCluster := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}) - defer mockCluster.Terminate(t) - - etcdTestCli = mockCluster.RandClient() - - check.TestingT(t) -} - -func (t *testKeeper) TestLockKeeper(c *check.C) { +func TestLockKeeper(t *testing.T) { var ( lk = NewLockKeeper(getDownstreamMeta) upSchema = "foo_1" @@ -56,8 +41,8 @@ func (t *testKeeper) TestLockKeeper(c *check.C) { p = parser.New() se = mock.NewContext() tblID int64 = 111 - tiBefore = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - tiAfter = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) + tiBefore = createTableInfo(t, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + tiAfter = createTableInfo(t, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) i11 = NewInfo(task1, source1, upSchema, upTable, downSchema, downTable, DDLs, tiBefore, []*model.TableInfo{tiAfter}) i12 = NewInfo(task1, source2, upSchema, upTable, downSchema, downTable, DDLs, tiBefore, []*model.TableInfo{tiAfter}) @@ -74,80 +59,80 @@ func (t *testKeeper) TestLockKeeper(c *check.C) { // lock with 2 sources. lockID1, newDDLs, cols, err := lk.TrySync(etcdTestCli, i11, tts1) - c.Assert(err, check.IsNil) - c.Assert(lockID1, check.Equals, "task1-`foo`.`bar`") - c.Assert(newDDLs, check.DeepEquals, DDLs) - c.Assert(cols, check.DeepEquals, []string{}) + require.NoError(t, err) + require.Equal(t, "task1-`foo`.`bar`", lockID1) + require.Equal(t, DDLs, newDDLs) + require.Equal(t, []string{}, cols) lock1 := lk.FindLock(lockID1) - c.Assert(lock1, check.NotNil) - c.Assert(lock1.ID, check.Equals, lockID1) - c.Assert(lk.FindLockByInfo(i11).ID, check.Equals, lockID1) + require.NotNil(t, lock1) + require.Equal(t, lockID1, lock1.ID) + require.Equal(t, lockID1, lk.FindLockByInfo(i11).ID) lks := lk.FindLocksByTask("hahaha") - c.Assert(len(lks), check.Equals, 0) + require.Equal(t, 0, len(lks)) lks = lk.FindLocksByTask(task1) - c.Assert(len(lks), check.Equals, 1) - c.Assert(lks[0].ID, check.Equals, lockID1) + require.Equal(t, 1, len(lks)) + require.Equal(t, lockID1, lks[0].ID) synced, remain := lock1.IsSynced() - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 1) + require.False(t, synced) + require.Equal(t, 1, remain) lockID1, newDDLs, cols, err = lk.TrySync(etcdTestCli, i12, tts1) - c.Assert(err, check.IsNil) - c.Assert(lockID1, check.Equals, "task1-`foo`.`bar`") - c.Assert(newDDLs, check.DeepEquals, DDLs) - c.Assert(cols, check.DeepEquals, []string{}) + require.NoError(t, err) + require.Equal(t, "task1-`foo`.`bar`", lockID1) + require.Equal(t, DDLs, newDDLs) + require.Equal(t, []string{}, cols) lock1 = lk.FindLock(lockID1) - c.Assert(lock1, check.NotNil) - c.Assert(lock1.ID, check.Equals, lockID1) + require.NotNil(t, lock1) + require.Equal(t, lockID1, lock1.ID) synced, remain = lock1.IsSynced() - c.Assert(synced, check.IsTrue) - c.Assert(remain, check.Equals, 0) + require.True(t, synced) + require.Equal(t, 0, remain) // lock with only 1 source. lockID2, newDDLs, cols, err := lk.TrySync(etcdTestCli, i21, tts2) - c.Assert(err, check.IsNil) - c.Assert(lockID2, check.Equals, "task2-`foo`.`bar`") - c.Assert(newDDLs, check.DeepEquals, DDLs) - c.Assert(cols, check.DeepEquals, []string{}) + require.NoError(t, err) + require.Equal(t, "task2-`foo`.`bar`", lockID2) + require.Equal(t, DDLs, newDDLs) + require.Equal(t, []string{}, cols) lock2 := lk.FindLock(lockID2) - c.Assert(lock2, check.NotNil) - c.Assert(lock2.ID, check.Equals, lockID2) + require.NotNil(t, lock2) + require.Equal(t, lockID2, lock2.ID) synced, remain = lock2.IsSynced() - c.Assert(synced, check.IsTrue) - c.Assert(remain, check.Equals, 0) + require.True(t, synced) + require.Equal(t, 0, remain) lks = lk.FindLocksByTask(task1) - c.Assert(len(lks), check.Equals, 1) - c.Assert(lks[0].ID, check.Equals, lockID1) + require.Equal(t, 1, len(lks)) + require.Equal(t, lockID1, lks[0].ID) lks = lk.FindLocksByTask(task2) - c.Assert(len(lks), check.Equals, 1) - c.Assert(lks[0].ID, check.Equals, lockID2) + require.Equal(t, 1, len(lks)) + require.Equal(t, lockID2, lks[0].ID) // try to find not-exists lock. lockIDNotExists := "lock-not-exists" - c.Assert(lk.FindLock(lockIDNotExists), check.IsNil) + require.Nil(t, lk.FindLock(lockIDNotExists)) // all locks. locks := lk.Locks() - c.Assert(locks, check.HasLen, 2) - c.Assert(locks[lockID1], check.Equals, lock1) // compare pointer - c.Assert(locks[lockID2], check.Equals, lock2) + require.Len(t, locks, 2) + require.Equal(t, lock1, locks[lockID1]) // compare pointer + require.Equal(t, lock2, locks[lockID2]) // remove lock. - c.Assert(lk.RemoveLock(lockID1), check.IsTrue) - c.Assert(lk.RemoveLock(lockIDNotExists), check.IsFalse) - c.Assert(lk.Locks(), check.HasLen, 1) + require.True(t, lk.RemoveLock(lockID1)) + require.False(t, lk.RemoveLock(lockIDNotExists)) + require.Len(t, lk.Locks(), 1) // clear locks. lk.Clear() // no locks exist. - c.Assert(lk.Locks(), check.HasLen, 0) + require.Len(t, lk.Locks(), 0) } -func (t *testKeeper) TestLockKeeperMultipleTarget(c *check.C) { +func TestLockKeeperMultipleTarget(t *testing.T) { var ( lk = NewLockKeeper(getDownstreamMeta) task = "test-lock-keeper-multiple-target" @@ -162,8 +147,8 @@ func (t *testKeeper) TestLockKeeperMultipleTarget(c *check.C) { p = parser.New() se = mock.NewContext() tblID int64 = 111 - tiBefore = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - tiAfter = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) + tiBefore = createTableInfo(t, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + tiAfter = createTableInfo(t, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) i11 = NewInfo(task, source, upSchema, upTables[0], downSchema, downTable1, DDLs, tiBefore, []*model.TableInfo{tiAfter}) i12 = NewInfo(task, source, upSchema, upTables[1], downSchema, downTable1, DDLs, tiBefore, []*model.TableInfo{tiAfter}) @@ -184,61 +169,61 @@ func (t *testKeeper) TestLockKeeperMultipleTarget(c *check.C) { // lock for target1. lockID1, newDDLs, cols, err := lk.TrySync(etcdTestCli, i11, tts1) - c.Assert(err, check.IsNil) - c.Assert(lockID1, check.DeepEquals, "test-lock-keeper-multiple-target-`foo`.`bar`") - c.Assert(newDDLs, check.DeepEquals, DDLs) - c.Assert(cols, check.DeepEquals, []string{}) + require.NoError(t, err) + require.Equal(t, "test-lock-keeper-multiple-target-`foo`.`bar`", lockID1) + require.Equal(t, DDLs, newDDLs) + require.Equal(t, []string{}, cols) // lock for target2. lockID2, newDDLs, cols, err := lk.TrySync(etcdTestCli, i21, tts2) - c.Assert(err, check.IsNil) - c.Assert(lockID2, check.DeepEquals, "test-lock-keeper-multiple-target-`foo`.`rab`") - c.Assert(newDDLs, check.DeepEquals, DDLs) - c.Assert(cols, check.DeepEquals, []string{}) + require.NoError(t, err) + require.Equal(t, "test-lock-keeper-multiple-target-`foo`.`rab`", lockID2) + require.Equal(t, DDLs, newDDLs) + require.Equal(t, []string{}, cols) // check two locks exist. lock1 := lk.FindLock(lockID1) - c.Assert(lock1, check.NotNil) - c.Assert(lock1.ID, check.Equals, lockID1) - c.Assert(lk.FindLockByInfo(i11).ID, check.Equals, lockID1) + require.NotNil(t, lock1) + require.Equal(t, lockID1, lock1.ID) + require.Equal(t, lockID1, lk.FindLockByInfo(i11).ID) synced, remain := lock1.IsSynced() - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 1) + require.False(t, synced) + require.Equal(t, 1, remain) lock2 := lk.FindLock(lockID2) - c.Assert(lock2, check.NotNil) - c.Assert(lock2.ID, check.Equals, lockID2) - c.Assert(lk.FindLockByInfo(i21).ID, check.Equals, lockID2) + require.NotNil(t, lock2) + require.Equal(t, lockID2, lock2.ID) + require.Equal(t, lockID2, lk.FindLockByInfo(i21).ID) synced, remain = lock2.IsSynced() - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 1) + require.False(t, synced) + require.Equal(t, 1, remain) // sync for two locks. lockID1, newDDLs, cols, err = lk.TrySync(etcdTestCli, i12, tts1) - c.Assert(err, check.IsNil) - c.Assert(lockID1, check.DeepEquals, "test-lock-keeper-multiple-target-`foo`.`bar`") - c.Assert(newDDLs, check.DeepEquals, DDLs) - c.Assert(cols, check.DeepEquals, []string{}) + require.NoError(t, err) + require.Equal(t, "test-lock-keeper-multiple-target-`foo`.`bar`", lockID1) + require.Equal(t, DDLs, newDDLs) + require.Equal(t, []string{}, cols) lockID2, newDDLs, cols, err = lk.TrySync(etcdTestCli, i22, tts2) - c.Assert(err, check.IsNil) - c.Assert(lockID2, check.DeepEquals, "test-lock-keeper-multiple-target-`foo`.`rab`") - c.Assert(newDDLs, check.DeepEquals, DDLs) - c.Assert(cols, check.DeepEquals, []string{}) + require.NoError(t, err) + require.Equal(t, "test-lock-keeper-multiple-target-`foo`.`rab`", lockID2) + require.Equal(t, DDLs, newDDLs) + require.Equal(t, []string{}, cols) lock1 = lk.FindLock(lockID1) - c.Assert(lock1, check.NotNil) - c.Assert(lock1.ID, check.Equals, lockID1) + require.NotNil(t, lock1) + require.Equal(t, lockID1, lock1.ID) synced, remain = lock1.IsSynced() - c.Assert(synced, check.IsTrue) - c.Assert(remain, check.Equals, 0) + require.True(t, synced) + require.Equal(t, 0, remain) lock2 = lk.FindLock(lockID2) - c.Assert(lock2, check.NotNil) - c.Assert(lock2.ID, check.Equals, lockID2) + require.NotNil(t, lock2) + require.Equal(t, lockID2, lock2.ID) synced, remain = lock2.IsSynced() - c.Assert(synced, check.IsTrue) - c.Assert(remain, check.Equals, 0) + require.True(t, synced) + require.Equal(t, 0, remain) } -func (t *testKeeper) TestTableKeeper(c *check.C) { +func TestTableKeeper(t *testing.T) { var ( tk = NewTableKeeper() task1 = "task-1" @@ -291,128 +276,128 @@ func (t *testKeeper) TestTableKeeper(c *check.C) { } // no tables exist before Init/Update. - c.Assert(tk.FindTables(task1, downSchema, downTable), check.IsNil) + require.Nil(t, tk.FindTables(task1, downSchema, downTable)) for schema, tables := range tt11.UpTables { for table := range tables { - c.Assert(tk.SourceTableExist(tt11.Task, tt11.Source, schema, table, downSchema, downTable), check.IsFalse) + require.False(t, tk.SourceTableExist(tt11.Task, tt11.Source, schema, table, downSchema, downTable)) } } // Init with `nil` is fine. tk.Init(nil) - c.Assert(tk.FindTables(task1, downSchema, downTable), check.IsNil) + require.Nil(t, tk.FindTables(task1, downSchema, downTable)) // tables for task1 exit after Init. tk.Init(stm) tts := tk.FindTables(task1, downSchema, downTable) - c.Assert(tts, check.HasLen, 2) - c.Assert(tts[0], check.DeepEquals, tt11) - c.Assert(tts[1], check.DeepEquals, tt12) + require.Len(t, tts, 2) + require.Equal(t, tt11, tts[0]) + require.Equal(t, tt12, tts[1]) for schema, tables := range tt11.UpTables { for table := range tables { - c.Assert(tk.SourceTableExist(tt11.Task, tt11.Source, schema, table, downSchema, downTable), check.IsTrue) + require.True(t, tk.SourceTableExist(tt11.Task, tt11.Source, schema, table, downSchema, downTable)) } } // adds new tables. addTables, dropTables := tk.Update(st21) - c.Assert(addTables, check.HasLen, 1) - c.Assert(dropTables, check.HasLen, 0) + require.Len(t, addTables, 1) + require.Len(t, dropTables, 0) tts = tk.FindTables(task2, downSchema, downTable) - c.Assert(tts, check.HasLen, 1) - c.Assert(tts[0], check.DeepEquals, tt21) + require.Len(t, tts, 1) + require.Equal(t, tt21, tts[0]) // updates/appends new tables. addTables, dropTables = tk.Update(st22) - c.Assert(addTables, check.HasLen, 1) - c.Assert(dropTables, check.HasLen, 0) + require.Len(t, addTables, 1) + require.Len(t, dropTables, 0) tts = tk.FindTables(task2, downSchema, downTable) - c.Assert(tts, check.HasLen, 1) - c.Assert(tts[0], check.DeepEquals, tt22) + require.Len(t, tts, 1) + require.Equal(t, tt22, tts[0]) for schema, tables := range tt22.UpTables { for table := range tables { - c.Assert(tk.SourceTableExist(tt22.Task, tt22.Source, schema, table, downSchema, downTable), check.IsTrue) + require.True(t, tk.SourceTableExist(tt22.Task, tt22.Source, schema, table, downSchema, downTable)) } } // deletes tables. st22.IsDeleted = true addTables, dropTables = tk.Update(st22) - c.Assert(addTables, check.HasLen, 0) - c.Assert(dropTables, check.HasLen, 2) - c.Assert(tk.FindTables(task2, downSchema, downTable), check.IsNil) + require.Len(t, addTables, 0) + require.Len(t, dropTables, 2) + require.Nil(t, tk.FindTables(task2, downSchema, downTable)) for schema, tables := range tt22.UpTables { for table := range tables { - c.Assert(tk.SourceTableExist(tt22.Task, tt22.Source, schema, table, downSchema, downTable), check.IsFalse) + require.False(t, tk.SourceTableExist(tt22.Task, tt22.Source, schema, table, downSchema, downTable)) } } // try to delete, but not exist. addTables, dropTables = tk.Update(st22) - c.Assert(addTables, check.HasLen, 0) - c.Assert(dropTables, check.HasLen, 0) + require.Len(t, addTables, 0) + require.Len(t, dropTables, 0) st22.Task = "not-exist" addTables, dropTables = tk.Update(st22) - c.Assert(addTables, check.HasLen, 0) - c.Assert(dropTables, check.HasLen, 0) + require.Len(t, addTables, 0) + require.Len(t, dropTables, 0) // tables for task1 not affected. tts = tk.FindTables(task1, downSchema, downTable) - c.Assert(tts, check.HasLen, 2) - c.Assert(tts[0], check.DeepEquals, tt11) - c.Assert(tts[1], check.DeepEquals, tt12) + require.Len(t, tts, 2) + require.Equal(t, tt11, tts[0]) + require.Equal(t, tt12, tts[1]) for schema, tables := range tt11.UpTables { for table := range tables { - c.Assert(tk.SourceTableExist(tt11.Task, tt11.Source, schema, table, downSchema, downTable), check.IsTrue) + require.True(t, tk.SourceTableExist(tt11.Task, tt11.Source, schema, table, downSchema, downTable)) } } // add a table for st11. - c.Assert(tk.AddTable(task1, st11.Source, "db-2", "tbl-3", downSchema, downTable), check.IsTrue) - c.Assert(tk.AddTable(task1, st11.Source, "db-2", "tbl-3", downSchema, downTable), check.IsFalse) + require.True(t, tk.AddTable(task1, st11.Source, "db-2", "tbl-3", downSchema, downTable)) + require.False(t, tk.AddTable(task1, st11.Source, "db-2", "tbl-3", downSchema, downTable)) tts = tk.FindTables(task1, downSchema, downTable) st11n := tts[0] - c.Assert(st11n.UpTables, check.HasKey, "db-2") - c.Assert(st11n.UpTables["db-2"], check.HasKey, "tbl-3") + require.Contains(t, st11n.UpTables, "db-2") + require.Contains(t, st11n.UpTables["db-2"], "tbl-3") // removed the added table in st11. - c.Assert(tk.RemoveTable(task1, st11.Source, "db-2", "tbl-3", downSchema, downTable), check.IsTrue) - c.Assert(tk.RemoveTable(task1, st11.Source, "db-2", "tbl-3", downSchema, downTable), check.IsFalse) + require.True(t, tk.RemoveTable(task1, st11.Source, "db-2", "tbl-3", downSchema, downTable)) + require.False(t, tk.RemoveTable(task1, st11.Source, "db-2", "tbl-3", downSchema, downTable)) tts = tk.FindTables(task1, downSchema, downTable) st11n = tts[0] - c.Assert(st11n.UpTables["db-2"], check.IsNil) + require.Nil(t, st11n.UpTables["db-2"]) // adds for not existing task takes no effect. - c.Assert(tk.AddTable("not-exist", st11.Source, "db-2", "tbl-3", downSchema, downTable), check.IsFalse) + require.False(t, tk.AddTable("not-exist", st11.Source, "db-2", "tbl-3", downSchema, downTable)) // adds for not existing source takes effect. - c.Assert(tk.AddTable(task1, "new-source", "db-2", "tbl-3", downSchema, downTable), check.IsTrue) + require.True(t, tk.AddTable(task1, "new-source", "db-2", "tbl-3", downSchema, downTable)) tts = tk.FindTables(task1, downSchema, downTable) - c.Assert(tts, check.HasLen, 3) - c.Assert(tts[2].Source, check.Equals, "new-source") - c.Assert(tts[2].UpTables["db-2"], check.HasKey, "tbl-3") + require.Len(t, tts, 3) + require.Equal(t, "new-source", tts[2].Source) + require.Contains(t, tts[2].UpTables["db-2"], "tbl-3") // removes for not existing task/source takes no effect. - c.Assert(tk.RemoveTable("not-exit", st12.Source, "db", "tbl-1", downSchema, downTable), check.IsFalse) - c.Assert(tk.RemoveTable(task1, "not-exit", "db", "tbl-1", downSchema, downTable), check.IsFalse) + require.False(t, tk.RemoveTable("not-exit", st12.Source, "db", "tbl-1", downSchema, downTable)) + require.False(t, tk.RemoveTable(task1, "not-exit", "db", "tbl-1", downSchema, downTable)) tts = tk.FindTables(task1, downSchema, downTable) - c.Assert(tts[1], check.DeepEquals, tt12) + require.Equal(t, tt12, tts[1]) - c.Assert(tk.RemoveTableByTask("hahaha"), check.IsFalse) + require.False(t, tk.RemoveTableByTask("hahaha")) tk.RemoveTableByTaskAndSources("hahaha", nil) tts = tk.FindTables(task1, downSchema, downTable) - c.Assert(tts, check.HasLen, 3) + require.Len(t, tts, 3) tk.RemoveTableByTaskAndSources(task1, []string{"hahaha"}) tts = tk.FindTables(task1, downSchema, downTable) - c.Assert(tts, check.HasLen, 3) + require.Len(t, tts, 3) tk.RemoveTableByTaskAndSources(task1, []string{source1, source2}) tts = tk.FindTables(task1, downSchema, downTable) - c.Assert(tts, check.HasLen, 1) - c.Assert(tts[0].Source, check.Equals, "new-source") - c.Assert(tts[0].UpTables["db-2"], check.HasKey, "tbl-3") + require.Len(t, tts, 1) + require.Equal(t, "new-source", tts[0].Source) + require.Contains(t, tts[0].UpTables["db-2"], "tbl-3") } -func (t *testKeeper) TestTargetTablesForTask(c *check.C) { +func TestTargetTablesForTask(t *testing.T) { var ( tk = NewTableKeeper() task1 = "task1" @@ -429,11 +414,11 @@ func (t *testKeeper) TestTargetTablesForTask(c *check.C) { ) // not exist task. - c.Assert(TargetTablesForTask("not-exist", downSchema, downTable1, stm), check.IsNil) + require.Nil(t, TargetTablesForTask("not-exist", downSchema, downTable1, stm)) // no tables exist. tts := TargetTablesForTask(task1, downSchema, downTable1, stm) - c.Assert(tts, check.DeepEquals, []TargetTable{}) + require.Equal(t, []TargetTable{}, tts) // add some tables. tt11 := stm[task1][source1] @@ -449,40 +434,40 @@ func (t *testKeeper) TestTargetTablesForTask(c *check.C) { // get tables back. tts = TargetTablesForTask(task1, downSchema, downTable1, stm) - c.Assert(tts, check.DeepEquals, []TargetTable{ + require.Equal(t, []TargetTable{ tt11.TargetTable(downSchema, downTable1), tt12.TargetTable(downSchema, downTable1), - }) + }, tts) tts = TargetTablesForTask(task2, downSchema, downTable1, stm) - c.Assert(tts, check.DeepEquals, []TargetTable{ + require.Equal(t, []TargetTable{ tt21.TargetTable(downSchema, downTable1), tt22.TargetTable(downSchema, downTable1), - }) + }, tts) tk.Init(stm) tts = tk.FindTables(task1, downSchema, downTable1) - c.Assert(tts, check.DeepEquals, []TargetTable{ + require.Equal(t, []TargetTable{ tt11.TargetTable(downSchema, downTable1), tt12.TargetTable(downSchema, downTable1), - }) + }, tts) // add some tables for another target table. - c.Assert(tk.AddTable(task1, source1, "foo-1", "bar-3", downSchema, downTable2), check.IsTrue) - c.Assert(tk.AddTable(task1, source1, "foo-1", "bar-4", downSchema, downTable2), check.IsTrue) + require.True(t, tk.AddTable(task1, source1, "foo-1", "bar-3", downSchema, downTable2)) + require.True(t, tk.AddTable(task1, source1, "foo-1", "bar-4", downSchema, downTable2)) tts = tk.FindTables(task1, downSchema, downTable2) - c.Assert(tts, check.DeepEquals, []TargetTable{ + require.Equal(t, []TargetTable{ newTargetTable(task1, source1, downSchema, downTable2, map[string]map[string]struct{}{ "foo-1": {"bar-3": struct{}{}, "bar-4": struct{}{}}, }), - }) + }, tts) } func getDownstreamMeta(string) (*dbconfig.DBConfig, string) { return nil, "" } -func (t *testKeeper) TestGetDownstreamMeta(c *check.C) { +func TestGetDownstreamMeta(t *testing.T) { var ( task1 = "hahaha" task2 = "hihihi" @@ -497,51 +482,51 @@ func (t *testKeeper) TestGetDownstreamMeta(c *check.C) { } } - conn.InitMockDB(c) + conn.InitMockDB(t) lk := NewLockKeeper(getDownstreamMetaFunc) - c.Assert(lk.downstreamMetaMap, check.HasLen, 0) + require.Len(t, lk.downstreamMetaMap, 0) downstreamMeta, err := lk.getDownstreamMeta(task3) - c.Assert(downstreamMeta, check.IsNil) - c.Assert(terror.ErrMasterOptimisticDownstreamMetaNotFound.Equal(err), check.IsTrue) + require.Nil(t, downstreamMeta) + require.True(t, terror.ErrMasterOptimisticDownstreamMetaNotFound.Equal(err)) downstreamMeta, err = lk.getDownstreamMeta(task1) - c.Assert(err, check.IsNil) - c.Assert(lk.downstreamMetaMap, check.HasLen, 1) - c.Assert(downstreamMeta, check.Equals, lk.downstreamMetaMap[task1]) + require.NoError(t, err) + require.Len(t, lk.downstreamMetaMap, 1) + require.Equal(t, lk.downstreamMetaMap[task1], downstreamMeta) downstreamMeta2, err := lk.getDownstreamMeta(task1) - c.Assert(err, check.IsNil) - c.Assert(lk.downstreamMetaMap, check.HasLen, 1) - c.Assert(downstreamMeta, check.Equals, downstreamMeta2) + require.NoError(t, err) + require.Len(t, lk.downstreamMetaMap, 1) + require.Equal(t, downstreamMeta2, downstreamMeta) downstreamMeta3, err := lk.getDownstreamMeta(task2) - c.Assert(err, check.IsNil) - c.Assert(lk.downstreamMetaMap, check.HasLen, 2) - c.Assert(lk.downstreamMetaMap, check.HasKey, task1) - c.Assert(lk.downstreamMetaMap, check.HasKey, task2) - c.Assert(downstreamMeta3, check.Equals, lk.downstreamMetaMap[task2]) + require.NoError(t, err) + require.Len(t, lk.downstreamMetaMap, 2) + require.Contains(t, lk.downstreamMetaMap, task1) + require.Contains(t, lk.downstreamMetaMap, task2) + require.Equal(t, lk.downstreamMetaMap[task2], downstreamMeta3) lk.RemoveDownstreamMeta(task3) - c.Assert(lk.downstreamMetaMap, check.HasLen, 2) - c.Assert(lk.downstreamMetaMap, check.HasKey, task1) - c.Assert(lk.downstreamMetaMap, check.HasKey, task2) + require.Len(t, lk.downstreamMetaMap, 2) + require.Contains(t, lk.downstreamMetaMap, task1) + require.Contains(t, lk.downstreamMetaMap, task2) lk.RemoveDownstreamMeta(task1) - c.Assert(lk.downstreamMetaMap, check.HasLen, 1) - c.Assert(lk.downstreamMetaMap, check.HasKey, task2) - c.Assert(downstreamMeta3, check.Equals, lk.downstreamMetaMap[task2]) + require.Len(t, lk.downstreamMetaMap, 1) + require.Contains(t, lk.downstreamMetaMap, task2) + require.Equal(t, lk.downstreamMetaMap[task2], downstreamMeta3) downstreamMeta, err = lk.getDownstreamMeta(task1) - c.Assert(err, check.IsNil) - c.Assert(lk.downstreamMetaMap, check.HasLen, 2) - c.Assert(downstreamMeta, check.Equals, lk.downstreamMetaMap[task1]) - c.Assert(downstreamMeta3, check.Equals, lk.downstreamMetaMap[task2]) + require.NoError(t, err) + require.Len(t, lk.downstreamMetaMap, 2) + require.Equal(t, lk.downstreamMetaMap[task1], downstreamMeta) + require.Equal(t, lk.downstreamMetaMap[task2], downstreamMeta3) lk.Clear() - c.Assert(lk.downstreamMetaMap, check.HasLen, 0) + require.Len(t, lk.downstreamMetaMap, 0) } -func (t *testKeeper) TestUpdateSourceTables(c *check.C) { +func TestUpdateSourceTables(t *testing.T) { var ( tk = NewTableKeeper() task1 = "task-1" @@ -573,18 +558,18 @@ func (t *testKeeper) TestUpdateSourceTables(c *check.C) { // put st11 addTables, dropTables := tk.Update(st11) - c.Assert(addTables, check.HasLen, 2) - c.Assert(dropTables, check.HasLen, 0) + require.Len(t, addTables, 2) + require.Len(t, dropTables, 0) // put st11 again addTables, dropTables = tk.Update(st11) - c.Assert(addTables, check.HasLen, 0) - c.Assert(dropTables, check.HasLen, 0) + require.Len(t, addTables, 0) + require.Len(t, dropTables, 0) // put st12 addTables, dropTables = tk.Update(st12) - c.Assert(addTables, check.HasLen, 2) - c.Assert(dropTables, check.HasLen, 0) + require.Len(t, addTables, 2) + require.Len(t, dropTables, 0) // update and put st12 newST := NewSourceTables(task1, source2) @@ -596,16 +581,16 @@ func (t *testKeeper) TestUpdateSourceTables(c *check.C) { newST.RemoveTable("db", "tbl-1", downSchema, downTable) newST.AddTable("db", "tbl-3", downSchema, downTable) addTables, dropTables = tk.Update(newST) - c.Assert(addTables, check.HasLen, 1) - c.Assert(dropTables, check.HasLen, 1) + require.Len(t, addTables, 1) + require.Len(t, dropTables, 1) // put st12 again addTables, dropTables = tk.Update(newST) - c.Assert(addTables, check.HasLen, 0) - c.Assert(dropTables, check.HasLen, 0) + require.Len(t, addTables, 0) + require.Len(t, dropTables, 0) // delete source table newST.IsDeleted = true addTables, dropTables = tk.Update(newST) - c.Assert(addTables, check.HasLen, 0) - c.Assert(dropTables, check.HasLen, 2) + require.Len(t, addTables, 0) + require.Len(t, dropTables, 2) } diff --git a/dm/pkg/shardddl/optimism/lock_test.go b/dm/pkg/shardddl/optimism/lock_test.go index f952463d4c..a5dd00bd04 100644 --- a/dm/pkg/shardddl/optimism/lock_test.go +++ b/dm/pkg/shardddl/optimism/lock_test.go @@ -19,7 +19,6 @@ import ( "testing" "github.com/DATA-DOG/go-sqlmock" - "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/meta/model" "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/ast" @@ -31,32 +30,27 @@ import ( "github.com/pingcap/tiflow/dm/pkg/log" "github.com/pingcap/tiflow/dm/pkg/terror" "github.com/pingcap/tiflow/dm/pkg/utils" - "go.etcd.io/etcd/tests/v3/integration" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" ) -type testLock struct{} - -var _ = check.Suite(&testLock{}) +type testLock struct { + suite.Suite +} func TestLock(t *testing.T) { - integration.BeforeTestExternal(t) - mockCluster := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}) - defer mockCluster.Terminate(t) - - etcdTestCli = mockCluster.RandClient() - - check.TestingT(t) + suite.Run(t, new(testLock)) } -func (t *testLock) SetUpSuite(c *check.C) { - c.Assert(log.InitLogger(&log.Config{}), check.IsNil) +func (t *testLock) SetupSuite() { + t.Require().NoError(log.InitLogger(&log.Config{})) } -func (t *testLock) TearDownSuite(c *check.C) { - clearTestInfoOperation(c) +func (t *testLock) TearDownSuite() { + clearTestInfoOperation(t.T()) } -func (t *testLock) TestLockTrySyncNormal(c *check.C) { +func (t *testLock) TestLockTrySyncNormal() { var ( ID = "test_lock_try_sync_normal-`foo`.`bar`" task = "test_lock_try_sync_normal" @@ -73,11 +67,11 @@ func (t *testLock) TestLockTrySyncNormal(c *check.C) { DDLs2 = []string{"ALTER TABLE bar ADD COLUMN c2 BIGINT", "ALTER TABLE bar ADD COLUMN c3 TEXT"} DDLs3 = []string{"ALTER TABLE bar DROP COLUMN c3"} DDLs4 = []string{"ALTER TABLE bar DROP COLUMN c2", "ALTER TABLE bar DROP COLUMN c1"} - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) - ti2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 BIGINT, c3 TEXT)`) - ti2_1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 BIGINT)`) - ti3 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 BIGINT)`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) + ti2 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 BIGINT, c3 TEXT)`) + ti2_1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 BIGINT)`) + ti3 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 BIGINT)`) ti4 = ti0 ti4_1 = ti1 tables = map[string]map[string]struct{}{ @@ -104,8 +98,8 @@ func (t *testLock) TestLockTrySyncNormal(c *check.C) { ) // the initial status is synced. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // CASE: all tables execute a single & same DDL (schema become larger). syncedCount := 0 @@ -116,7 +110,7 @@ func (t *testLock) TestLockTrySyncNormal(c *check.C) { synced := source != source2 // tables before the last source have synced. for _, db2 := range dbs { for _, tbl2 := range tbls { - c.Assert(ready[source2][db2][tbl2], check.Equals, synced) + t.Require().Equal(synced, ready[source2][db2][tbl2]) } } } @@ -126,113 +120,113 @@ func (t *testLock) TestLockTrySyncNormal(c *check.C) { for _, tbl := range tbls { info := newInfoWithVersion(task, source, db, tbl, downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) syncedCount++ synced, remain := l.IsSynced() - c.Assert(synced, check.Equals, syncedCount == tableCount) - c.Assert(remain, check.Equals, tableCount-syncedCount) - c.Assert(synced, check.Equals, l.synced) + t.Require().Equal(syncedCount == tableCount, synced) + t.Require().Equal(tableCount-syncedCount, remain) + t.Require().Equal(l.synced, synced) } } } // synced again after all tables applied the DDL. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // CASE: TrySync again after synced is idempotent. info := newInfoWithVersion(task, sources[0], dbs[0], tbls[0], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) + t.checkLockSynced(l) + t.checkLockNoDone(l) // CASE: need to add more than one DDL to reach the desired schema (schema become larger). // add two columns for one table. info = newInfoWithVersion(task, sources[0], dbs[0], tbls[0], downSchema, downTable, DDLs2, ti1, []*model.TableInfo{ti2_1, ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs2, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready := l.Ready() - c.Assert(ready[sources[0]][dbs[0]][tbls[0]], check.IsTrue) - c.Assert(ready[sources[0]][dbs[0]][tbls[1]], check.IsFalse) + t.Require().True(ready[sources[0]][dbs[0]][tbls[0]]) + t.Require().False(ready[sources[0]][dbs[0]][tbls[1]]) // TrySync again is idempotent (more than one DDL). info = newInfoWithVersion(task, sources[0], dbs[0], tbls[0], downSchema, downTable, DDLs2, ti1, []*model.TableInfo{ti2_1, ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs2, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready[sources[0]][dbs[0]][tbls[0]], check.IsTrue) - c.Assert(ready[sources[0]][dbs[0]][tbls[1]], check.IsFalse) + t.Require().True(ready[sources[0]][dbs[0]][tbls[0]]) + t.Require().False(ready[sources[0]][dbs[0]][tbls[1]]) // add only the first column for another table. info = newInfoWithVersion(task, sources[0], dbs[0], tbls[1], downSchema, downTable, DDLs2[0:1], ti1, []*model.TableInfo{ti2_1}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2[0:1]) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs2[0:1], DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready[sources[0]][dbs[0]][tbls[0]], check.IsTrue) - c.Assert(ready[sources[0]][dbs[0]][tbls[1]], check.IsFalse) + t.Require().True(ready[sources[0]][dbs[0]][tbls[0]]) + t.Require().False(ready[sources[0]][dbs[0]][tbls[1]]) synced, remain := l.IsSynced() - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, tableCount-1) - c.Assert(synced, check.Equals, l.synced) + t.Require().False(synced) + t.Require().Equal(tableCount-1, remain) + t.Require().Equal(l.synced, synced) cmp, err := l.tables[sources[0]][dbs[0]][tbls[0]].Compare(l.tables[sources[0]][dbs[0]][tbls[1]]) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 1) + t.Require().NoError(err) + t.Require().Equal(1, cmp) // TrySync again is idempotent info = newInfoWithVersion(task, sources[0], dbs[0], tbls[1], downSchema, downTable, DDLs2[0:1], ti1, []*model.TableInfo{ti2_1}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2[0:1]) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs2[0:1], DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready[sources[0]][dbs[0]][tbls[0]], check.IsTrue) - c.Assert(ready[sources[0]][dbs[0]][tbls[1]], check.IsFalse) + t.Require().True(ready[sources[0]][dbs[0]][tbls[0]]) + t.Require().False(ready[sources[0]][dbs[0]][tbls[1]]) // add the second column for another table. info = newInfoWithVersion(task, sources[0], dbs[0], tbls[1], downSchema, downTable, DDLs2[1:2], ti2_1, []*model.TableInfo{ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2[1:2]) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs2[1:2], DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready[sources[0]][dbs[0]][tbls[1]], check.IsTrue) // ready now. + t.Require().True(ready[sources[0]][dbs[0]][tbls[1]]) // ready now. synced, remain = l.IsSynced() - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, tableCount-2) - c.Assert(synced, check.Equals, l.synced) + t.Require().False(synced) + t.Require().Equal(tableCount-2, remain) + t.Require().Equal(l.synced, synced) cmp, err = l.tables[sources[0]][dbs[0]][tbls[0]].Compare(l.tables[sources[0]][dbs[0]][tbls[1]]) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) // Try again (for the second DDL). info = newInfoWithVersion(task, sources[0], dbs[0], tbls[1], downSchema, downTable, DDLs2[1:2], ti2_1, []*model.TableInfo{ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2[1:2]) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs2[1:2], DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) - t.trySyncForAllTablesLarger(c, l, DDLs2, ti1, []*model.TableInfo{ti2_1, ti2}, tts, vers) - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.trySyncForAllTablesLarger(l, DDLs2, ti1, []*model.TableInfo{ti2_1, ti2}, tts, vers) + t.checkLockSynced(l) + t.checkLockNoDone(l) // CASE: all tables execute a single & same DDL (schema become smaller). syncedCount = 0 @@ -243,7 +237,7 @@ func (t *testLock) TestLockTrySyncNormal(c *check.C) { synced = source == source2 // tables before the last source have not synced. for _, db2 := range dbs { for _, tbl2 := range tbls { - c.Assert(ready[source2][db2][tbl2], check.Equals, synced) + t.Require().Equal(synced, ready[source2][db2][tbl2]) } } } @@ -254,92 +248,92 @@ func (t *testLock) TestLockTrySyncNormal(c *check.C) { syncedCount++ info = newInfoWithVersion(task, source, db, tbl, downSchema, downTable, DDLs3, ti2, []*model.TableInfo{ti3}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(l.versions, check.DeepEquals, vers) - c.Assert(cols, check.DeepEquals, []string{"c3"}) + t.Require().NoError(err) + t.Require().Equal(vers, l.versions) + t.Require().Equal([]string{"c3"}, cols) synced, remain = l.IsSynced() - c.Assert(synced, check.Equals, l.synced) + t.Require().Equal(l.synced, synced) if syncedCount == tableCount { - c.Assert(DDLs, check.DeepEquals, DDLs3) - c.Assert(synced, check.IsTrue) - c.Assert(remain, check.Equals, 0) + t.Require().Equal(DDLs3, DDLs) + t.Require().True(synced) + t.Require().Equal(0, remain) } else { - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, syncedCount) + t.Require().Equal([]string{}, DDLs) + t.Require().False(synced) + t.Require().Equal(syncedCount, remain) } } } } - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // CASE: need to drop more than one DDL to reach the desired schema (schema become smaller). // drop two columns for one table. info = newInfoWithVersion(task, sources[0], dbs[0], tbls[0], downSchema, downTable, DDLs4, ti3, []*model.TableInfo{ti4_1, ti4}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{"c2", "c1"}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{"c2", "c1"}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready[sources[0]][dbs[0]][tbls[0]], check.IsFalse) - c.Assert(ready[sources[0]][dbs[0]][tbls[1]], check.IsTrue) + t.Require().False(ready[sources[0]][dbs[0]][tbls[0]]) + t.Require().True(ready[sources[0]][dbs[0]][tbls[1]]) // TrySync again is idempotent. info = newInfoWithVersion(task, sources[0], dbs[0], tbls[0], downSchema, downTable, DDLs4, ti3, []*model.TableInfo{ti4_1, ti4}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{"c2", "c1"}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{"c2", "c1"}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready[sources[0]][dbs[0]][tbls[0]], check.IsFalse) - c.Assert(ready[sources[0]][dbs[0]][tbls[1]], check.IsTrue) + t.Require().False(ready[sources[0]][dbs[0]][tbls[0]]) + t.Require().True(ready[sources[0]][dbs[0]][tbls[1]]) // drop only the first column for another table. info = newInfoWithVersion(task, sources[0], dbs[0], tbls[1], downSchema, downTable, DDLs4[0:1], ti3, []*model.TableInfo{ti4_1}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{"c2"}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{"c2"}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready[sources[0]][dbs[0]][tbls[0]], check.IsFalse) - c.Assert(ready[sources[0]][dbs[0]][tbls[1]], check.IsFalse) + t.Require().False(ready[sources[0]][dbs[0]][tbls[0]]) + t.Require().False(ready[sources[0]][dbs[0]][tbls[1]]) cmp, err = l.tables[sources[0]][dbs[0]][tbls[0]].Compare(l.tables[sources[0]][dbs[0]][tbls[1]]) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) // TrySync again (only the first DDL). info = newInfoWithVersion(task, sources[0], dbs[0], tbls[1], downSchema, downTable, DDLs4[0:1], ti3, []*model.TableInfo{ti4_1}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{"c2"}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{"c2"}, cols) + t.Require().Equal(vers, l.versions) // drop the second column for another table. info = newInfoWithVersion(task, sources[0], dbs[0], tbls[1], downSchema, downTable, DDLs4[1:2], ti4_1, []*model.TableInfo{ti4}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{"c1"}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{"c1"}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready[sources[0]][dbs[0]][tbls[0]], check.IsFalse) - c.Assert(ready[sources[0]][dbs[0]][tbls[1]], check.IsFalse) + t.Require().False(ready[sources[0]][dbs[0]][tbls[0]]) + t.Require().False(ready[sources[0]][dbs[0]][tbls[1]]) cmp, err = l.tables[sources[0]][dbs[0]][tbls[0]].Compare(l.tables[sources[0]][dbs[0]][tbls[1]]) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) // TrySync again (for the second DDL). info = newInfoWithVersion(task, sources[0], dbs[0], tbls[1], downSchema, downTable, DDLs4[1:2], ti4_1, []*model.TableInfo{ti4}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{"c1"}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{"c1"}, cols) + t.Require().Equal(vers, l.versions) // try drop columns for other tables to reach the same schema. remain = tableCount - 2 @@ -349,24 +343,24 @@ func (t *testLock) TestLockTrySyncNormal(c *check.C) { if synced2 { // do not `TrySync` again for previous two (un-synced now). info = newInfoWithVersion(task, source, schema, table, downSchema, downTable, DDLs4, ti3, []*model.TableInfo{ti4_1, ti4}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(cols, check.DeepEquals, []string{"c2", "c1"}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal([]string{"c2", "c1"}, cols) + t.Require().Equal(vers, l.versions) remain-- if remain == 0 { - c.Assert(DDLs, check.DeepEquals, DDLs4) + t.Require().Equal(DDLs4, DDLs) } else { - c.Assert(DDLs, check.DeepEquals, []string{}) + t.Require().Equal([]string{}, DDLs) } } } } } - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) } -func (t *testLock) TestLockTrySyncIndex(c *check.C) { +func (t *testLock) TestLockTrySyncIndex() { // nolint:dupl var ( ID = "test_lock_try_sync_index-`foo`.`bar`" @@ -381,8 +375,8 @@ func (t *testLock) TestLockTrySyncIndex(c *check.C) { tblID int64 = 111 DDLs1 = []string{"ALTER TABLE bar DROP INDEX idx_c1"} DDLs2 = []string{"ALTER TABLE bar ADD UNIQUE INDEX idx_c1(c1)"} - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, UNIQUE INDEX idx_c1(c1))`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, UNIQUE INDEX idx_c1(c1))`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) ti2 = ti0 tables = map[string]map[string]struct{}{ db: {tbls[0]: struct{}{}, tbls[1]: struct{}{}}, @@ -401,55 +395,55 @@ func (t *testLock) TestLockTrySyncIndex(c *check.C) { ) // the initial status is synced. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // try sync for one table, `DROP INDEX` returned directly (to make schema become more compatible). // `DROP INDEX` is handled like `ADD COLUMN`. info := newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) synced, remain := l.IsSynced() - c.Assert(synced, check.Equals, l.synced) - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 1) + t.Require().Equal(l.synced, synced) + t.Require().False(synced) + t.Require().Equal(1, remain) // try sync for another table, also got `DROP INDEX` now. info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) - t.checkLockSynced(c, l) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) + t.checkLockSynced(l) // try sync for one table, `ADD INDEX` not returned directly (to keep the schema more compatible). // `ADD INDEX` is handled like `DROP COLUMN`. info = newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs2, ti1, []*model.TableInfo{ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, []string{}) // no DDLs returned - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal([]string{}, DDLs) // no DDLs returned + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) synced, remain = l.IsSynced() - c.Assert(synced, check.Equals, l.synced) - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 1) + t.Require().Equal(l.synced, synced) + t.Require().False(synced) + t.Require().Equal(1, remain) // try sync for another table, got `ADD INDEX` now. info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs2, ti1, []*model.TableInfo{ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) - t.checkLockSynced(c, l) + t.Require().NoError(err) + t.Require().Equal(DDLs2, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) + t.checkLockSynced(l) } -func (t *testLock) TestLockTrySyncNullNotNull(c *check.C) { +func (t *testLock) TestLockTrySyncNullNotNull() { // nolint:dupl var ( ID = "test_lock_try_sync_null_not_null-`foo`.`bar`" @@ -464,8 +458,8 @@ func (t *testLock) TestLockTrySyncNullNotNull(c *check.C) { tblID int64 = 111 DDLs1 = []string{"ALTER TABLE bar MODIFY COLUMN c1 INT NOT NULL DEFAULT 1234"} DDLs2 = []string{"ALTER TABLE bar MODIFY COLUMN c1 INT NULL DEFAULT 1234"} - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT NULL DEFAULT 1234)`) - ti1 = createTableInfo(c, p, se, tblID, + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT NULL DEFAULT 1234)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT NOT NULL DEFAULT 1234)`) ti2 = ti0 tables = map[string]map[string]struct{}{ @@ -485,45 +479,45 @@ func (t *testLock) TestLockTrySyncNullNotNull(c *check.C) { ) // the initial status is synced. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) for i := 0; i < 2; i++ { // two round // try sync for one table, from `NULL` to `NOT NULL`, no DDLs returned. info := newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) // try sync for another table, DDLs returned. info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) // try sync for one table, from `NOT NULL` to `NULL`, DDLs returned. info = newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs2, ti1, []*model.TableInfo{ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs2, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) // try sync for another table, from `NOT NULL` to `NULL`, DDLs, returned. info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs2, ti1, []*model.TableInfo{ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs2, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) } } -func (t *testLock) TestLockTrySyncIntBigint(c *check.C) { +func (t *testLock) TestLockTrySyncIntBigint() { var ( ID = "test_lock_try_sync_int_bigint-`foo`.`bar`" task = "test_lock_try_sync_int_bigint" @@ -536,8 +530,8 @@ func (t *testLock) TestLockTrySyncIntBigint(c *check.C) { se = mock.NewContext() tblID int64 = 111 DDLs1 = []string{"ALTER TABLE bar MODIFY COLUMN c1 BIGINT NOT NULL DEFAULT 1234"} - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT NOT NULL DEFAULT 1234)`) - ti1 = createTableInfo(c, p, se, tblID, + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT NOT NULL DEFAULT 1234)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 BIGINT NOT NULL DEFAULT 1234)`) tables = map[string]map[string]struct{}{ db: {tbls[0]: struct{}{}, tbls[1]: struct{}{}}, @@ -556,27 +550,27 @@ func (t *testLock) TestLockTrySyncIntBigint(c *check.C) { ) // the initial status is synced. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // try sync for one table, from `INT` to `BIGINT`, DDLs returned. info := newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) // try sync for another table, DDLs returned. info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) } -func (t *testLock) TestLockTrySyncNoDiff(c *check.C) { +func (t *testLock) TestLockTrySyncNoDiff() { var ( ID = "test_lock_try_sync_no_diff-`foo`.`bar`" task = "test_lock_try_sync_no_diff" @@ -589,8 +583,8 @@ func (t *testLock) TestLockTrySyncNoDiff(c *check.C) { se = mock.NewContext() tblID int64 = 111 DDLs1 = []string{"ALTER TABLE bar RENAME c1 TO c2"} - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) - ti1 = createTableInfo(c, p, se, tblID, + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c2 INT)`) // `c1` dropped, `c2` added tables = map[string]map[string]struct{}{ db: {tbls[0]: struct{}{}, tbls[1]: struct{}{}}, @@ -609,19 +603,19 @@ func (t *testLock) TestLockTrySyncNoDiff(c *check.C) { ) // the initial status is synced. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // try sync for one table. info := newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(terror.ErrShardDDLOptimismNeedSkipAndRedirect.Equal(err), check.IsTrue) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().True(terror.ErrShardDDLOptimismNeedSkipAndRedirect.Equal(err)) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) } -func (t *testLock) TestLockTrySyncNewTable(c *check.C) { +func (t *testLock) TestLockTrySyncNewTable() { var ( ID = "test_lock_try_sync_new_table-`foo`.`bar`" task = "test_lock_try_sync_new_table" @@ -637,8 +631,8 @@ func (t *testLock) TestLockTrySyncNewTable(c *check.C) { se = mock.NewContext() tblID int64 = 111 DDLs1 = []string{"ALTER TABLE bar ADD COLUMN c1 INT"} - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) tables = map[string]map[string]struct{}{db1: {tbl1: struct{}{}}} tts = []TargetTable{newTargetTable(task, source1, downSchema, downTable, tables)} @@ -654,25 +648,25 @@ func (t *testLock) TestLockTrySyncNewTable(c *check.C) { ) // only one table exists before TrySync. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // TrySync for a new table as the caller. info := newInfoWithVersion(task, source2, db2, tbl2, downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready := l.Ready() - c.Assert(ready, check.HasLen, 2) - c.Assert(ready[source1], check.HasLen, 1) - c.Assert(ready[source1][db1], check.HasLen, 1) - c.Assert(ready[source1][db1][tbl1], check.IsFalse) - c.Assert(ready[source2], check.HasLen, 1) - c.Assert(ready[source2][db2], check.HasLen, 1) - c.Assert(ready[source2][db2][tbl2], check.IsTrue) + t.Require().Len(ready, 2) + t.Require().Len(ready[source1], 1) + t.Require().Len(ready[source1][db1], 1) + t.Require().False(ready[source1][db1][tbl1]) + t.Require().Len(ready[source2], 1) + t.Require().Len(ready[source2][db2], 1) + t.Require().True(ready[source2][db2][tbl2]) // TrySync for two new tables as extra sources. // newly added work table use tableInfoBefore as table info @@ -685,42 +679,42 @@ func (t *testLock) TestLockTrySyncNewTable(c *check.C) { info = newInfoWithVersion(task, source1, db1, tbl1, downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready, check.HasLen, 2) - c.Assert(ready[source1], check.HasLen, 1) - c.Assert(ready[source1][db1], check.HasLen, 2) - c.Assert(ready[source1][db1][tbl1], check.IsTrue) - c.Assert(ready[source1][db1][tbl2], check.IsFalse) // new table use ti0 as init table - c.Assert(ready[source2], check.HasLen, 1) - c.Assert(ready[source2][db2], check.HasLen, 2) - c.Assert(ready[source2][db2][tbl1], check.IsFalse) - c.Assert(ready[source2][db2][tbl2], check.IsTrue) + t.Require().Len(ready, 2) + t.Require().Len(ready[source1], 1) + t.Require().Len(ready[source1][db1], 2) + t.Require().True(ready[source1][db1][tbl1]) + t.Require().False(ready[source1][db1][tbl2]) // new table use ti0 as init table + t.Require().Len(ready[source2], 1) + t.Require().Len(ready[source2][db2], 2) + t.Require().False(ready[source2][db2][tbl1]) + t.Require().True(ready[source2][db2][tbl2]) info = newInfoWithVersion(task, source1, db1, tbl2, downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready, check.HasLen, 2) - c.Assert(ready[source1], check.HasLen, 1) - c.Assert(ready[source1][db1], check.HasLen, 2) - c.Assert(ready[source1][db1][tbl1], check.IsTrue) - c.Assert(ready[source1][db1][tbl2], check.IsTrue) - c.Assert(ready[source2], check.HasLen, 1) - c.Assert(ready[source2][db2], check.HasLen, 2) - c.Assert(ready[source2][db2][tbl1], check.IsFalse) - c.Assert(ready[source2][db2][tbl2], check.IsTrue) + t.Require().Len(ready, 2) + t.Require().Len(ready[source1], 1) + t.Require().Len(ready[source1][db1], 2) + t.Require().True(ready[source1][db1][tbl1]) + t.Require().True(ready[source1][db1][tbl2]) + t.Require().Len(ready[source2], 1) + t.Require().Len(ready[source2][db2], 2) + t.Require().False(ready[source2][db2][tbl1]) + t.Require().True(ready[source2][db2][tbl2]) } -func (t *testLock) TestLockTrySyncRevert(c *check.C) { +func (t *testLock) TestLockTrySyncRevert() { var ( ID = "test_lock_try_sync_revert-`foo`.`bar`" task = "test_lock_try_sync_revert" @@ -735,15 +729,15 @@ func (t *testLock) TestLockTrySyncRevert(c *check.C) { DDLs1 = []string{"ALTER TABLE bar ADD COLUMN c1 TEXT"} DDLs2 = []string{"ALTER TABLE bar DROP COLUMN c1"} - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT)`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT)`) ti2 = ti0 DDLs3 = []string{"ALTER TABLE bar ADD COLUMN c1 TEXT", "ALTER TABLE bar ADD COLUMN c2 INT"} DDLs4 = []string{"ALTER TABLE bar DROP COLUMN c2"} DDLs5 = []string{"ALTER TABLE bar DROP COLUMN c1"} - ti3 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT, c2 INT)`) - ti4 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT)`) + ti3 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT, c2 INT)`) + ti4 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT)`) ti5 = ti0 DDLs6 = DDLs3 @@ -765,149 +759,149 @@ func (t *testLock) TestLockTrySyncRevert(c *check.C) { ) // the initial status is synced. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // CASE: revert for single DDL. // TrySync for one table. info := newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready := l.Ready() - c.Assert(ready[source][db][tbls[0]], check.IsTrue) - c.Assert(ready[source][db][tbls[1]], check.IsFalse) + t.Require().True(ready[source][db][tbls[0]]) + t.Require().False(ready[source][db][tbls[1]]) joined, err := l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err := l.tables[source][db][tbls[0]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) // revert for the table, become synced again. info = newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs2, ti1, []*model.TableInfo{ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2) - c.Assert(cols, check.DeepEquals, []string{"c1"}) - c.Assert(l.versions, check.DeepEquals, vers) - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.Require().NoError(err) + t.Require().Equal(DDLs2, DDLs) + t.Require().Equal([]string{"c1"}, cols) + t.Require().Equal(vers, l.versions) + t.checkLockSynced(l) + t.checkLockNoDone(l) // Simulate watch done operation from dm-worker op := NewOperation(utils.GenDDLLockID(task, downSchema, downTable), task, source, db, tbls[0], DDLs2, ConflictNone, "", true, []string{"c1"}) - c.Assert(l.DeleteColumnsByOp(op), check.IsNil) + t.Require().NoError(l.DeleteColumnsByOp(op)) // CASE: revert for multiple DDLs. // TrySync for one table. info = newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs3, ti0, []*model.TableInfo{ti4, ti3}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs3) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs3, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready[source][db][tbls[0]], check.IsTrue) - c.Assert(ready[source][db][tbls[1]], check.IsFalse) + t.Require().True(ready[source][db][tbls[0]]) + t.Require().False(ready[source][db][tbls[1]]) joined, err = l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = l.tables[source][db][tbls[0]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) // revert part of the DDLs. info = newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs4, ti3, []*model.TableInfo{ti4}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs4) - c.Assert(cols, check.DeepEquals, []string{"c2"}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs4, DDLs) + t.Require().Equal([]string{"c2"}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready[source][db][tbls[1]], check.IsFalse) + t.Require().False(ready[source][db][tbls[1]]) joined, err = l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = l.tables[source][db][tbls[0]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) // revert the reset part of the DDLs. info = newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs5, ti4, []*model.TableInfo{ti5}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs5) - c.Assert(cols, check.DeepEquals, []string{"c1"}) - c.Assert(l.versions, check.DeepEquals, vers) - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.Require().NoError(err) + t.Require().Equal(DDLs5, DDLs) + t.Require().Equal([]string{"c1"}, cols) + t.Require().Equal(vers, l.versions) + t.checkLockSynced(l) + t.checkLockNoDone(l) // Simulate watch done operation from dm-worker op = NewOperation(utils.GenDDLLockID(task, downSchema, downTable), task, source, db, tbls[0], DDLs4, ConflictNone, "", true, []string{"c2"}) - c.Assert(l.DeleteColumnsByOp(op), check.IsNil) + t.Require().NoError(l.DeleteColumnsByOp(op)) op = NewOperation(utils.GenDDLLockID(task, downSchema, downTable), task, source, db, tbls[0], DDLs5, ConflictNone, "", true, []string{"c1"}) - c.Assert(l.DeleteColumnsByOp(op), check.IsNil) + t.Require().NoError(l.DeleteColumnsByOp(op)) // CASE: revert part of multiple DDLs. // TrySync for one table. info = newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs6, ti0, []*model.TableInfo{ti7, ti6}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs6) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs6, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready[source][db][tbls[1]], check.IsFalse) + t.Require().False(ready[source][db][tbls[1]]) joined, err = l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = l.tables[source][db][tbls[0]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) // revert part of the DDLs. info = newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs7, ti3, []*model.TableInfo{ti7}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs7) - c.Assert(cols, check.DeepEquals, []string{"c2"}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs7, DDLs) + t.Require().Equal([]string{"c2"}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready[source][db][tbls[1]], check.IsFalse) + t.Require().False(ready[source][db][tbls[1]]) joined, err = l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = l.tables[source][db][tbls[0]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) // TrySync for another table. info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs8, ti0, []*model.TableInfo{ti8}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs8) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.Require().NoError(err) + t.Require().Equal(DDLs8, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) + t.checkLockSynced(l) + t.checkLockNoDone(l) } -func (t *testLock) TestLockTrySyncConflictNonIntrusive(c *check.C) { +func (t *testLock) TestLockTrySyncConflictNonIntrusive() { var ( ID = "test_lock_try_sync_conflict_non_intrusive-`foo`.`bar`" task = "test_lock_try_sync_conflict_non_intrusive" @@ -923,10 +917,10 @@ func (t *testLock) TestLockTrySyncConflictNonIntrusive(c *check.C) { DDLs2 = []string{"ALTER TABLE bar ADD COLUMN c1 DATETIME", "ALTER TABLE bar ADD COLUMN c2 INT"} DDLs3 = []string{"ALTER TABLE bar DROP COLUMN c1"} DDLs4 = DDLs2 - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT)`) - ti2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 DATETIME, c2 INT)`) - ti2_1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 DATETIME)`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT)`) + ti2 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 DATETIME, c2 INT)`) + ti2_1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 DATETIME)`) ti3 = ti0 ti4 = ti2 ti4_1 = ti2_1 @@ -943,94 +937,94 @@ func (t *testLock) TestLockTrySyncConflictNonIntrusive(c *check.C) { ) // the initial status is synced. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // TrySync for the first table, construct the joined schema. info := newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready := l.Ready() - c.Assert(ready[source][db][tbls[0]], check.IsTrue) - c.Assert(ready[source][db][tbls[1]], check.IsFalse) + t.Require().True(ready[source][db][tbls[0]]) + t.Require().False(ready[source][db][tbls[1]]) joined, err := l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err := l.tables[source][db][tbls[0]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) // TrySync for the second table with another schema (add two columns, one of them will cause conflict). info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs2, ti0, []*model.TableInfo{ti2_1, ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(terror.ErrShardDDLOptimismTrySyncFail.Equal(err), check.IsTrue) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().True(terror.ErrShardDDLOptimismTrySyncFail.Equal(err)) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) joined, err = l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) // join table isn't updated - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) ready = l.Ready() - c.Assert(ready[source][db][tbls[1]], check.IsFalse) + t.Require().False(ready[source][db][tbls[1]]) // TrySync for the first table to resolve the conflict. info = newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs3, ti1, []*model.TableInfo{ti3}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs3) - c.Assert(cols, check.DeepEquals, []string{"c1"}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs3, DDLs) + t.Require().Equal([]string{"c1"}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() // all table ready - c.Assert(ready[source][db][tbls[0]], check.IsTrue) - c.Assert(ready[source][db][tbls[1]], check.IsTrue) + t.Require().True(ready[source][db][tbls[0]]) + t.Require().True(ready[source][db][tbls[1]]) joined, err = l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = l.tables[source][db][tbls[0]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) // TrySync for the second table, succeed now info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs2, ti0, []*model.TableInfo{ti2_1, ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs2, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) joined, err = l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) ready = l.Ready() - c.Assert(ready[source][db][tbls[1]], check.IsTrue) + t.Require().True(ready[source][db][tbls[1]]) // Simulate watch done operation from dm-worker op := NewOperation(utils.GenDDLLockID(task, downSchema, downTable), task, source, db, tbls[0], DDLs3, ConflictNone, "", true, []string{"c1"}) - c.Assert(l.DeleteColumnsByOp(op), check.IsNil) + t.Require().NoError(l.DeleteColumnsByOp(op)) // TrySync for the first table. info = newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs4, ti0, []*model.TableInfo{ti4_1, ti4}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs4) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.Require().NoError(err) + t.Require().Equal(DDLs4, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) + t.checkLockSynced(l) + t.checkLockNoDone(l) } -func (t *testLock) TestLockTrySyncConflictIntrusive(c *check.C) { +func (t *testLock) TestLockTrySyncConflictIntrusive() { var ( ID = "test_lock_try_sync_conflict_intrusive-`foo`.`bar`" task = "test_lock_try_sync_conflict_intrusive" @@ -1045,21 +1039,21 @@ func (t *testLock) TestLockTrySyncConflictIntrusive(c *check.C) { DDLs1 = []string{"ALTER TABLE bar ADD COLUMN c1 TEXT"} DDLs2 = []string{"ALTER TABLE bar ADD COLUMN c1 DATETIME", "ALTER TABLE bar ADD COLUMN c2 INT"} DDLs3 = []string{"ALTER TABLE bar ADD COLUMN c1 DATETIME"} - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT)`) - ti2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 DATETIME, c2 INT)`) - ti3 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 DATETIME)`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT)`) + ti2 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 DATETIME, c2 INT)`) + ti3 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 DATETIME)`) DDLs5 = []string{"ALTER TABLE bar ADD COLUMN c2 TEXT"} DDLs6 = []string{"ALTER TABLE bar ADD COLUMN c2 DATETIME", "ALTER TABLE bar ADD COLUMN c3 INT"} DDLs7 = []string{"ALTER TABLE bar ADD COLUMN c3 INT"} DDLs8_1 = DDLs7 DDLs8_2 = DDLs5 - ti5 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT, c2 TEXT)`) - ti6 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT, c2 DATETIME, c3 INT)`) - ti6_1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT, c2 DATETIME)`) - ti7 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT, c3 INT)`) - ti8 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT, c2 TEXT, c3 INT)`) + ti5 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT, c2 TEXT)`) + ti6 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT, c2 DATETIME, c3 INT)`) + ti6_1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT, c2 DATETIME)`) + ti7 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT, c3 INT)`) + ti8 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT, c2 TEXT, c3 INT)`) tables = map[string]map[string]struct{}{db: {tbls[0]: struct{}{}, tbls[1]: struct{}{}}} tts = []TargetTable{newTargetTable(task, source, downSchema, downTable, tables)} @@ -1073,167 +1067,167 @@ func (t *testLock) TestLockTrySyncConflictIntrusive(c *check.C) { ) // the initial status is synced. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // CASE: conflict happen, revert all changes to resolve the conflict. // TrySync for the first table, construct the joined schema. info := newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready := l.Ready() - c.Assert(ready[source][db][tbls[0]], check.IsTrue) - c.Assert(ready[source][db][tbls[1]], check.IsFalse) + t.Require().True(ready[source][db][tbls[0]]) + t.Require().False(ready[source][db][tbls[1]]) joined, err := l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err := l.tables[source][db][tbls[0]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) // TrySync for the second table with another schema (add two columns, one of them will cause conflict). info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs2, ti0, []*model.TableInfo{ti3, ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(terror.ErrShardDDLOptimismTrySyncFail.Equal(err), check.IsTrue) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().True(terror.ErrShardDDLOptimismTrySyncFail.Equal(err)) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) joined, err = l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) // join table isn't updated - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) ready = l.Ready() - c.Assert(ready[source][db][tbls[1]], check.IsFalse) + t.Require().False(ready[source][db][tbls[1]]) // TrySync again. info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs2, ti0, []*model.TableInfo{ti3, ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(terror.ErrShardDDLOptimismTrySyncFail.Equal(err), check.IsTrue) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().True(terror.ErrShardDDLOptimismTrySyncFail.Equal(err)) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) joined, err = l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) // TrySync for the second table to replace a new ddl without non-conflict column, the conflict should still exist. info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs3, ti0, []*model.TableInfo{ti3}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(terror.ErrShardDDLOptimismTrySyncFail.Equal(err), check.IsTrue) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().True(terror.ErrShardDDLOptimismTrySyncFail.Equal(err)) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) joined, err = l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) ready = l.Ready() - c.Assert(ready[source][db][tbls[1]], check.IsFalse) + t.Require().False(ready[source][db][tbls[1]]) // TrySync for the second table as we did for the first table, the lock should be synced. info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) joined, err = l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.Require().NoError(err) + t.Require().Equal(0, cmp) + t.checkLockSynced(l) + t.checkLockNoDone(l) // CASE: conflict happen, revert part of changes to resolve the conflict. // TrySync for the first table, construct the joined schema. info = newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs5, ti1, []*model.TableInfo{ti5}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs5) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs5, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready[source][db][tbls[0]], check.IsTrue) - c.Assert(ready[source][db][tbls[1]], check.IsFalse) + t.Require().True(ready[source][db][tbls[0]]) + t.Require().False(ready[source][db][tbls[1]]) joined, err = l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = l.tables[source][db][tbls[0]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) // TrySync for the second table with another schema (add two columns, one of them will cause conflict). info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs6, ti1, []*model.TableInfo{ti6_1, ti6}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(terror.ErrShardDDLOptimismTrySyncFail.Equal(err), check.IsTrue) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{}) + t.Require().True(terror.ErrShardDDLOptimismTrySyncFail.Equal(err)) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{}, cols) joined, err = l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready[source][db][tbls[1]], check.IsFalse) + t.Require().False(ready[source][db][tbls[1]]) // TrySync for the second table to replace a new ddl without conflict column, the conflict should be resolved. // but both of tables are not synced now. info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs7, ti1, []*model.TableInfo{ti7}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs7) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs7, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready[source][db][tbls[0]], check.IsFalse) - c.Assert(ready[source][db][tbls[1]], check.IsFalse) + t.Require().False(ready[source][db][tbls[0]]) + t.Require().False(ready[source][db][tbls[1]]) joined, err = l.Joined() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = l.tables[source][db][tbls[0]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) cmp, err = l.tables[source][db][tbls[1]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + t.Require().NoError(err) + t.Require().Equal(-1, cmp) // TrySync for the first table to become synced. info = newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs8_1, ti5, []*model.TableInfo{ti8}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs8_1) - c.Assert(cols, check.DeepEquals, []string{}) + t.Require().NoError(err) + t.Require().Equal(DDLs8_1, DDLs) + t.Require().Equal([]string{}, cols) ready = l.Ready() - c.Assert(ready[source][db][tbls[0]], check.IsTrue) + t.Require().True(ready[source][db][tbls[0]]) // TrySync for the second table to become synced. info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs8_2, ti7, []*model.TableInfo{ti8}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs8_2) - c.Assert(cols, check.DeepEquals, []string{}) + t.Require().NoError(err) + t.Require().Equal(DDLs8_2, DDLs) + t.Require().Equal([]string{}, cols) ready = l.Ready() - c.Assert(ready[source][db][tbls[1]], check.IsTrue) + t.Require().True(ready[source][db][tbls[1]]) // all tables synced now. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) } -func (t *testLock) TestLockTrySyncMultipleChangeDDL(c *check.C) { +func (t *testLock) TestLockTrySyncMultipleChangeDDL() { var ( ID = "test_lock_try_sync_normal-`foo`.`bar`" task = "test_lock_try_sync_normal" @@ -1250,12 +1244,12 @@ func (t *testLock) TestLockTrySyncMultipleChangeDDL(c *check.C) { DDLs2 = []string{"ALTER TABLE bar DROP COLUMN c2", "ALTER TABLE bar ADD COLUMN c3 TEXT"} // DDLs3 = []string{"ALTER TABLE bar DROP COLUMN c3"} // DDLs4 = []string{"ALTER TABLE bar DROP COLUMN c2", "ALTER TABLE bar DROP COLUMN c1"} - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) - ti1_1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 INT)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c2 INT)`) - ti2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c3 TEXT)`) - ti2_1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - // ti3 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 BIGINT)`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) + ti1_1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 INT)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c2 INT)`) + ti2 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c3 TEXT)`) + ti2_1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + // ti3 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 BIGINT)`) // ti4 = ti0 // ti4_1 = ti1 tables = map[string]map[string]struct{}{ @@ -1282,24 +1276,24 @@ func (t *testLock) TestLockTrySyncMultipleChangeDDL(c *check.C) { ) // the initial status is synced. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // inconsistent ddls and table infos info := newInfoWithVersion(task, sources[0], dbs[0], tbls[0], downSchema, downTable, DDLs1[:1], ti0, []*model.TableInfo{ti1_1, ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(terror.ErrMasterInconsistentOptimisticDDLsAndInfo.Equal(err), check.IsTrue) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().True(terror.ErrMasterInconsistentOptimisticDDLsAndInfo.Equal(err)) info = newInfoWithVersion(task, sources[0], dbs[0], tbls[0], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(terror.ErrMasterInconsistentOptimisticDDLsAndInfo.Equal(err), check.IsTrue) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().True(terror.ErrMasterInconsistentOptimisticDDLsAndInfo.Equal(err)) - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // CASE: all tables execute a same multiple change DDLs1 syncedCount := 0 @@ -1318,32 +1312,32 @@ func (t *testLock) TestLockTrySyncMultipleChangeDDL(c *check.C) { for _, tbl := range tbls { info = newInfoWithVersion(task, source, db, tbl, downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1_1, ti1}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, resultDDLs1[source][db][tbl]) - c.Assert(cols, check.DeepEquals, []string{"c1"}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(resultDDLs1[source][db][tbl], DDLs) + t.Require().Equal([]string{"c1"}, cols) + t.Require().Equal(vers, l.versions) syncedCount++ synced, _ := l.IsSynced() - c.Assert(synced, check.Equals, syncedCount == tableCount) - c.Assert(synced, check.Equals, l.synced) + t.Require().Equal(syncedCount == tableCount, synced) + t.Require().Equal(l.synced, synced) } } } // synced again after all tables applied the DDL. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // CASE: TrySync again after synced is idempotent. // both ddl will sync again info = newInfoWithVersion(task, sources[0], dbs[0], tbls[0], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1_1, ti1}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{"c1"}) - c.Assert(l.versions, check.DeepEquals, vers) - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{"c1"}, cols) + t.Require().Equal(vers, l.versions) + t.checkLockSynced(l) + t.checkLockNoDone(l) // CASE: all tables execute a same multiple change DDLs2 syncedCount = 0 @@ -1362,34 +1356,34 @@ func (t *testLock) TestLockTrySyncMultipleChangeDDL(c *check.C) { for _, tbl := range tbls { info = newInfoWithVersion(task, source, db, tbl, downSchema, downTable, DDLs2, ti1, []*model.TableInfo{ti2_1, ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, resultDDLs2[source][db][tbl]) - c.Assert(cols, check.DeepEquals, []string{"c2"}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(resultDDLs2[source][db][tbl], DDLs) + t.Require().Equal([]string{"c2"}, cols) + t.Require().Equal(vers, l.versions) syncedCount++ synced, _ := l.IsSynced() - c.Assert(synced, check.Equals, syncedCount == tableCount) - c.Assert(synced, check.Equals, l.synced) + t.Require().Equal(syncedCount == tableCount, synced) + t.Require().Equal(l.synced, synced) } } } // synced again after all tables applied the DDL. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // CASE: TrySync again after synced is idempotent. info = newInfoWithVersion(task, sources[0], dbs[0], tbls[0], downSchema, downTable, DDLs2, ti1, []*model.TableInfo{ti2_1, ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2) - c.Assert(cols, check.DeepEquals, []string{"c2"}) - c.Assert(l.versions, check.DeepEquals, vers) - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.Require().NoError(err) + t.Require().Equal(DDLs2, DDLs) + t.Require().Equal([]string{"c2"}, cols) + t.Require().Equal(vers, l.versions) + t.checkLockSynced(l) + t.checkLockNoDone(l) } -func (t *testLock) TestTryRemoveTable(c *check.C) { +func (t *testLock) TestTryRemoveTable() { var ( ID = "test_lock_try_remove_table-`foo`.`bar`" task = "test_lock_try_remove_table" @@ -1404,9 +1398,9 @@ func (t *testLock) TestTryRemoveTable(c *check.C) { tblID int64 = 111 DDLs1 = []string{"ALTER TABLE bar ADD COLUMN c1 INT"} DDLs2 = []string{"ALTER TABLE bar ADD COLUMN c2 INT"} - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) - ti2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 INT)`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) + ti2 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 INT)`) tables = map[string]map[string]struct{}{db: {tbl1: struct{}{}, tbl2: struct{}{}}} tts = []TargetTable{newTargetTable(task, source, downSchema, downTable, tables)} @@ -1420,23 +1414,23 @@ func (t *testLock) TestTryRemoveTable(c *check.C) { ) // only one table exists before TrySync. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // CASE: remove a table as normal. // TrySync for the first table. info := newInfoWithVersion(task, source, db, tbl1, downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready := l.Ready() - c.Assert(ready, check.HasLen, 1) - c.Assert(ready[source], check.HasLen, 1) - c.Assert(ready[source][db], check.HasLen, 2) - c.Assert(ready[source][db][tbl1], check.IsTrue) - c.Assert(ready[source][db][tbl2], check.IsFalse) + t.Require().Len(ready, 1) + t.Require().Len(ready[source], 1) + t.Require().Len(ready[source][db], 2) + t.Require().True(ready[source][db][tbl1]) + t.Require().False(ready[source][db][tbl2]) // TryRemoveTable for the second table. l.columns = map[string]map[string]map[string]map[string]DropColumnStage{ @@ -1445,48 +1439,48 @@ func (t *testLock) TestTryRemoveTable(c *check.C) { }, } col := l.TryRemoveTable(source, db, tbl2) - c.Assert(col, check.DeepEquals, []string{"col"}) + t.Require().Equal([]string{"col"}, col) delete(vers[source][db], tbl2) ready = l.Ready() - c.Assert(ready, check.HasLen, 1) - c.Assert(ready[source], check.HasLen, 1) - c.Assert(ready[source][db], check.HasLen, 1) - c.Assert(ready[source][db][tbl1], check.IsTrue) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().Len(ready, 1) + t.Require().Len(ready[source], 1) + t.Require().Len(ready[source][db], 1) + t.Require().True(ready[source][db][tbl1]) + t.Require().Equal(vers, l.versions) // CASE: remove a table will rebuild joined schema now. // TrySync to add the second back. vers[source][db][tbl2] = 0 info = newInfoWithVersion(task, source, db, tbl2, downSchema, downTable, DDLs2, ti1, []*model.TableInfo{ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs2, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready, check.HasLen, 1) - c.Assert(ready[source], check.HasLen, 1) - c.Assert(ready[source][db], check.HasLen, 2) - c.Assert(ready[source][db][tbl1], check.IsFalse) - c.Assert(ready[source][db][tbl2], check.IsTrue) + t.Require().Len(ready, 1) + t.Require().Len(ready[source], 1) + t.Require().Len(ready[source][db], 2) + t.Require().False(ready[source][db][tbl1]) + t.Require().True(ready[source][db][tbl2]) // TryRemoveTable for the second table. - c.Assert(l.TryRemoveTable(source, db, tbl2), check.HasLen, 0) + t.Require().Len(l.TryRemoveTable(source, db, tbl2), 0) delete(vers[source][db], tbl2) ready = l.Ready() - c.Assert(ready, check.HasLen, 1) - c.Assert(ready[source], check.HasLen, 1) - c.Assert(ready[source][db], check.HasLen, 1) - c.Assert(ready[source][db][tbl1], check.IsTrue) // the joined schema is rebuild. - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().Len(ready, 1) + t.Require().Len(ready[source], 1) + t.Require().Len(ready[source][db], 1) + t.Require().True(ready[source][db][tbl1]) // the joined schema is rebuild. + t.Require().Equal(vers, l.versions) // CASE: try to remove for not-exists table. - c.Assert(l.TryRemoveTable(source, db, "not-exist"), check.HasLen, 0) - c.Assert(l.TryRemoveTable(source, "not-exist", tbl1), check.HasLen, 0) - c.Assert(l.TryRemoveTable("not-exist", db, tbl1), check.HasLen, 0) + t.Require().Len(l.TryRemoveTable(source, db, "not-exist"), 0) + t.Require().Len(l.TryRemoveTable(source, "not-exist", tbl1), 0) + t.Require().Len(l.TryRemoveTable("not-exist", db, tbl1), 0) } -func (t *testLock) TestTryRemoveTableWithSources(c *check.C) { +func (t *testLock) TestTryRemoveTableWithSources() { var ( ID = "test_lock_try_remove_table-`foo`.`bar`" task = "test_lock_try_remove_table" @@ -1501,8 +1495,8 @@ func (t *testLock) TestTryRemoveTableWithSources(c *check.C) { se = mock.NewContext() tblID int64 = 111 DDLs1 = []string{"ALTER TABLE bar DROP COLUMN c1"} - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) tables = map[string]map[string]struct{}{db: {tbl1: struct{}{}, tbl2: struct{}{}}} tts = []TargetTable{newTargetTable(task, source1, downSchema, downTable, tables), newTargetTable(task, source2, downSchema, downTable, tables)} @@ -1519,71 +1513,71 @@ func (t *testLock) TestTryRemoveTableWithSources(c *check.C) { ) // only one table exists before TrySync. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // TrySync for the first table. info := newInfoWithVersion(task, source1, db, tbl1, downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{"c1"}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{"c1"}, cols) + t.Require().Equal(vers, l.versions) ready := l.Ready() - c.Assert(ready, check.HasLen, 2) - c.Assert(ready[source1], check.HasLen, 1) - c.Assert(ready[source1][db], check.HasLen, 2) - c.Assert(ready[source1][db][tbl1], check.IsFalse) - c.Assert(ready[source1][db][tbl2], check.IsTrue) - c.Assert(ready[source2], check.HasLen, 1) - c.Assert(ready[source2][db], check.HasLen, 2) - c.Assert(ready[source2][db][tbl1], check.IsTrue) - c.Assert(ready[source2][db][tbl2], check.IsTrue) + t.Require().Len(ready, 2) + t.Require().Len(ready[source1], 1) + t.Require().Len(ready[source1][db], 2) + t.Require().False(ready[source1][db][tbl1]) + t.Require().True(ready[source1][db][tbl2]) + t.Require().Len(ready[source2], 1) + t.Require().Len(ready[source2][db], 2) + t.Require().True(ready[source2][db][tbl1]) + t.Require().True(ready[source2][db][tbl2]) // TryRemoveTableBySources with nil - c.Assert(len(l.TryRemoveTableBySources(nil)), check.Equals, 0) + t.Require().Equal(0, len(l.TryRemoveTableBySources(nil))) ready = l.Ready() - c.Assert(ready, check.HasLen, 2) + t.Require().Len(ready, 2) // TryRemoveTableBySources with wrong source tts = tts[:1] - c.Assert(len(l.TryRemoveTableBySources([]string{"hahaha"})), check.Equals, 0) + t.Require().Equal(0, len(l.TryRemoveTableBySources([]string{"hahaha"}))) ready = l.Ready() - c.Assert(ready, check.HasLen, 2) + t.Require().Len(ready, 2) // TryRemoveTableBySources with source2 - c.Assert(len(l.TryRemoveTableBySources([]string{source2})), check.Equals, 0) + t.Require().Equal(0, len(l.TryRemoveTableBySources([]string{source2}))) ready = l.Ready() - c.Assert(ready, check.HasLen, 1) - c.Assert(ready[source1], check.HasLen, 1) - c.Assert(ready[source1][db], check.HasLen, 2) - c.Assert(ready[source1][db][tbl1], check.IsFalse) - c.Assert(ready[source1][db][tbl2], check.IsTrue) + t.Require().Len(ready, 1) + t.Require().Len(ready[source1], 1) + t.Require().Len(ready[source1][db], 2) + t.Require().False(ready[source1][db][tbl1]) + t.Require().True(ready[source1][db][tbl2]) delete(vers, source2) - c.Assert(l.versions, check.DeepEquals, vers) - c.Assert(l.HasTables(), check.IsTrue) + t.Require().Equal(vers, l.versions) + t.Require().True(l.HasTables()) // TrySync with second table info = newInfoWithVersion(task, source1, db, tbl2, downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{"c1"}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{"c1"}, cols) + t.Require().Equal(vers, l.versions) ready = l.Ready() - c.Assert(ready, check.HasLen, 1) - c.Assert(ready[source1], check.HasLen, 1) - c.Assert(ready[source1][db], check.HasLen, 2) - c.Assert(ready[source1][db][tbl1], check.IsTrue) - c.Assert(ready[source1][db][tbl2], check.IsTrue) + t.Require().Len(ready, 1) + t.Require().Len(ready[source1], 1) + t.Require().Len(ready[source1][db], 2) + t.Require().True(ready[source1][db][tbl1]) + t.Require().True(ready[source1][db][tbl2]) // TryRemoveTableBySources with source1,source2 cols = l.TryRemoveTableBySources([]string{source1}) - c.Assert(cols, check.DeepEquals, []string{"c1"}) - c.Assert(l.HasTables(), check.IsFalse) + t.Require().Equal([]string{"c1"}, cols) + t.Require().False(l.HasTables()) } -func (t *testLock) TestLockTryMarkDone(c *check.C) { +func (t *testLock) TestLockTryMarkDone() { var ( ID = "test_lock_try_mark_done-`foo`.`bar`" task = "test_lock_try_mark_done" @@ -1598,9 +1592,9 @@ func (t *testLock) TestLockTryMarkDone(c *check.C) { DDLs1 = []string{"ALTER TABLE bar ADD COLUMN c1 INT"} DDLs2 = []string{"ALTER TABLE bar ADD COLUMN c1 INT", "ALTER TABLE bar ADD COLUMN c2 INT"} DDLs3 = []string{"ALTER TABLE bar ADD COLUMN c2 INT"} - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) - ti2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 INT)`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) + ti2 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, c2 INT)`) ti3 = ti2 tables = map[string]map[string]struct{}{db: {tbls[0]: struct{}{}, tbls[1]: struct{}{}}} @@ -1615,79 +1609,79 @@ func (t *testLock) TestLockTryMarkDone(c *check.C) { ) // the initial status is synced but not resolved. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) - c.Assert(l.IsResolved(), check.IsFalse) + t.checkLockSynced(l) + t.checkLockNoDone(l) + t.Require().False(l.IsResolved()) // TrySync for the first table, no table has done the DDLs operation. info := newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) - t.checkLockNoDone(c, l) - c.Assert(l.IsResolved(), check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) + t.checkLockNoDone(l) + t.Require().False(l.IsResolved()) // mark done for the synced table, the lock is un-resolved. - c.Assert(l.TryMarkDone(source, db, tbls[0]), check.IsTrue) - c.Assert(l.IsDone(source, db, tbls[0]), check.IsTrue) - c.Assert(l.IsDone(source, db, tbls[1]), check.IsFalse) - c.Assert(l.IsResolved(), check.IsFalse) + t.Require().True(l.TryMarkDone(source, db, tbls[0])) + t.Require().True(l.IsDone(source, db, tbls[0])) + t.Require().False(l.IsDone(source, db, tbls[1])) + t.Require().False(l.IsResolved()) // TrySync for the second table, the joined schema become larger. info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs2, ti0, []*model.TableInfo{ti1, ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs2, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) // the first table is still keep `done` (for the previous DDLs operation) - c.Assert(l.IsDone(source, db, tbls[0]), check.IsTrue) - c.Assert(l.IsDone(source, db, tbls[1]), check.IsFalse) - c.Assert(l.IsResolved(), check.IsFalse) + t.Require().True(l.IsDone(source, db, tbls[0])) + t.Require().False(l.IsDone(source, db, tbls[1])) + t.Require().False(l.IsResolved()) // mark done for the second table, both of them are done (for different DDLs operations) - c.Assert(l.TryMarkDone(source, db, tbls[1]), check.IsTrue) - c.Assert(l.IsDone(source, db, tbls[0]), check.IsTrue) - c.Assert(l.IsDone(source, db, tbls[1]), check.IsTrue) + t.Require().True(l.TryMarkDone(source, db, tbls[1])) + t.Require().True(l.IsDone(source, db, tbls[0])) + t.Require().True(l.IsDone(source, db, tbls[1])) // but the lock is still not resolved because tables have different schemas. - c.Assert(l.IsResolved(), check.IsFalse) + t.Require().False(l.IsResolved()) // TrySync for the first table, all tables become synced. info = newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs3, ti1, []*model.TableInfo{ti3}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs3) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs3, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) // the first table become not-done, and the lock is un-resolved. - c.Assert(l.IsDone(source, db, tbls[0]), check.IsFalse) - c.Assert(l.IsDone(source, db, tbls[1]), check.IsTrue) - c.Assert(l.IsResolved(), check.IsFalse) + t.Require().False(l.IsDone(source, db, tbls[0])) + t.Require().True(l.IsDone(source, db, tbls[1])) + t.Require().False(l.IsResolved()) // mark done for the first table. - c.Assert(l.TryMarkDone(source, db, tbls[0]), check.IsTrue) - c.Assert(l.IsDone(source, db, tbls[0]), check.IsTrue) - c.Assert(l.IsDone(source, db, tbls[1]), check.IsTrue) + t.Require().True(l.TryMarkDone(source, db, tbls[0])) + t.Require().True(l.IsDone(source, db, tbls[0])) + t.Require().True(l.IsDone(source, db, tbls[1])) // the lock become resolved now. - c.Assert(l.IsResolved(), check.IsTrue) + t.Require().True(l.IsResolved()) // TryMarkDone for not-existing table take no effect. - c.Assert(l.TryMarkDone(source, db, "not-exist"), check.IsFalse) - c.Assert(l.TryMarkDone(source, "not-exist", tbls[0]), check.IsFalse) - c.Assert(l.TryMarkDone("not-exist", db, tbls[0]), check.IsFalse) + t.Require().False(l.TryMarkDone(source, db, "not-exist")) + t.Require().False(l.TryMarkDone(source, "not-exist", tbls[0])) + t.Require().False(l.TryMarkDone("not-exist", db, tbls[0])) // check IsDone for not-existing table take no effect. - c.Assert(l.IsDone(source, db, "not-exist"), check.IsFalse) - c.Assert(l.IsDone(source, "not-exist", tbls[0]), check.IsFalse) - c.Assert(l.IsDone("not-exist", db, tbls[0]), check.IsFalse) + t.Require().False(l.IsDone(source, db, "not-exist")) + t.Require().False(l.IsDone(source, "not-exist", tbls[0])) + t.Require().False(l.IsDone("not-exist", db, tbls[0])) } -func (t *testLock) TestAddDifferentFieldLenColumns(c *check.C) { +func (t *testLock) TestAddDifferentFieldLenColumns() { var ( ID = "test_lock_add_diff_flen_cols-`foo`.`bar`" task = "test_lock_add_diff_flen_cols" @@ -1700,9 +1694,9 @@ func (t *testLock) TestAddDifferentFieldLenColumns(c *check.C) { se = mock.NewContext() tblID int64 = 111 - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 VARCHAR(4))`) - ti2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 VARCHAR(5))`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 VARCHAR(4))`) + ti2 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 VARCHAR(5))`) DDLs1 = []string{"ALTER TABLE bar ADD COLUMN c1 VARCHAR(4)"} DDLs2 = []string{"ALTER TABLE bar ADD COLUMN c1 VARCHAR(5)"} @@ -1722,37 +1716,40 @@ func (t *testLock) TestAddDifferentFieldLenColumns(c *check.C) { } ) col, err := AddDifferentFieldLenColumns(ID, DDLs1[0], table1, table2) - c.Assert(col, check.Equals, "c1") - c.Assert(err, check.IsNil) + t.Require().Equal("c1", col) + t.Require().NoError(err) col, err = AddDifferentFieldLenColumns(ID, DDLs2[0], table2, table3) - c.Assert(col, check.Equals, "c1") - c.Assert(err, check.ErrorMatches, ".*add columns with different field lengths.*") + t.Require().Equal("c1", col) + t.Require().Error(err) + t.Require().Regexp(".*add columns with different field lengths.*", err.Error()) col, err = AddDifferentFieldLenColumns(ID, DDLs1[0], table3, table2) - c.Assert(col, check.Equals, "c1") - c.Assert(err, check.ErrorMatches, ".*add columns with different field lengths.*") + t.Require().Equal("c1", col) + t.Require().Error(err) + t.Require().Regexp(".*add columns with different field lengths.*", err.Error()) // the initial status is synced but not resolved. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) - c.Assert(l.IsResolved(), check.IsFalse) + t.checkLockSynced(l) + t.checkLockNoDone(l) + t.Require().False(l.IsResolved()) // TrySync for the first table, no table has done the DDLs operation. info := newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) - t.checkLockNoDone(c, l) - c.Assert(l.IsResolved(), check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) + t.checkLockNoDone(l) + t.Require().False(l.IsResolved()) // TrySync for the second table, add a table with a larger field length info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs2, ti0, []*model.TableInfo{ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.ErrorMatches, ".*add columns with different field lengths.*") - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().Error(err) + t.Require().Regexp(".*add columns with different field lengths.*", err.Error()) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) // case 2: add a column with a smaller field length l = NewLock(etcdTestCli, ID, task, downSchema, downTable, schemacmp.Encode(ti0), tts, nil) @@ -1762,23 +1759,24 @@ func (t *testLock) TestAddDifferentFieldLenColumns(c *check.C) { info = NewInfo(task, source, db, tbls[1], downSchema, downTable, DDLs2, ti0, []*model.TableInfo{ti2}) info.Version = vers[source][db][tbls[1]] DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) - t.checkLockNoDone(c, l) - c.Assert(l.IsResolved(), check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(DDLs2, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) + t.checkLockNoDone(l) + t.Require().False(l.IsResolved()) // TrySync for the second table, add a table with a smaller field length info = newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.ErrorMatches, ".*add columns with different field lengths.*") - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().Error(err) + t.Require().Regexp(".*add columns with different field lengths.*", err.Error()) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) } -func (t *testLock) TestAddNotFullyDroppedColumns(c *check.C) { +func (t *testLock) TestAddNotFullyDroppedColumns() { var ( ID = "test_lock_add_not_fully_dropped_cols-`foo`.`bar`" task = "test_lock_add_not_fully_dropped_cols" @@ -1791,10 +1789,10 @@ func (t *testLock) TestAddNotFullyDroppedColumns(c *check.C) { se = mock.NewContext() tblID int64 = 111 - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, b int, c int)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, b int)`) - ti2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - ti3 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c int)`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, b int, c int)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, b int)`) + ti2 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + ti3 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c int)`) DDLs1 = []string{"ALTER TABLE bar DROP COLUMN c"} DDLs2 = []string{"ALTER TABLE bar DROP COLUMN b"} @@ -1831,105 +1829,108 @@ func (t *testLock) TestAddNotFullyDroppedColumns(c *check.C) { } ) col, err := GetColumnName(ID, DDLs1[0], ast.AlterTableDropColumn) - c.Assert(col, check.Equals, "c") - c.Assert(err, check.IsNil) + t.Require().Equal("c", col) + t.Require().NoError(err) col, err = GetColumnName(ID, DDLs2[0], ast.AlterTableDropColumn) - c.Assert(col, check.Equals, "b") - c.Assert(err, check.IsNil) + t.Require().Equal("b", col) + t.Require().NoError(err) // the initial status is synced but not resolved. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) - c.Assert(l.IsResolved(), check.IsFalse) + t.checkLockSynced(l) + t.checkLockNoDone(l) + t.Require().False(l.IsResolved()) // TrySync for the first table, drop column c DDLs, cols, err := l.TrySync(newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers), tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{"c"}) - c.Assert(l.versions, check.DeepEquals, vers) - c.Assert(l.IsResolved(), check.IsFalse) + t.Require().NoError(err) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{"c"}, cols) + t.Require().Equal(vers, l.versions) + t.Require().False(l.IsResolved()) // TrySync for the first table, drop column b DDLs, cols, err = l.TrySync(newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs2, ti1, []*model.TableInfo{ti2}, vers), tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, []string{}) - c.Assert(cols, check.DeepEquals, []string{"b"}) - c.Assert(l.versions, check.DeepEquals, vers) - c.Assert(l.IsResolved(), check.IsFalse) + t.Require().NoError(err) + t.Require().Equal([]string{}, DDLs) + t.Require().Equal([]string{"b"}, cols) + t.Require().Equal(vers, l.versions) + t.Require().False(l.IsResolved()) colm, _, err := GetAllDroppedColumns(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(colm, check.DeepEquals, colm1) + t.Require().NoError(err) + t.Require().Equal(colm1, colm) // TrySync for the second table, drop column b, this column should be fully dropped DDLs, cols, err = l.TrySync(newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs2, ti0, []*model.TableInfo{ti3}, vers), tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2) - c.Assert(cols, check.DeepEquals, []string{"b"}) - c.Assert(l.versions, check.DeepEquals, vers) - c.Assert(l.IsResolved(), check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(DDLs2, DDLs) + t.Require().Equal([]string{"b"}, cols) + t.Require().Equal(vers, l.versions) + t.Require().False(l.IsResolved()) // Simulate watch done operation from dm-worker op := NewOperation(utils.GenDDLLockID(task, downSchema, downTable), task, source, db, tbls[1], DDLs2, ConflictNone, "", true, []string{"b"}) - c.Assert(l.DeleteColumnsByOp(op), check.IsNil) + t.Require().NoError(l.DeleteColumnsByOp(op)) colm, _, err = GetAllDroppedColumns(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(colm, check.DeepEquals, colm2) + t.Require().NoError(err) + t.Require().Equal(colm2, colm) op = NewOperation(utils.GenDDLLockID(task, downSchema, downTable), task, source, db, tbls[0], []string{}, ConflictNone, "", true, []string{"b"}) - c.Assert(l.DeleteColumnsByOp(op), check.IsNil) + t.Require().NoError(l.DeleteColumnsByOp(op)) colm, _, err = GetAllDroppedColumns(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(colm, check.DeepEquals, colm3) + t.Require().NoError(err) + t.Require().Equal(colm3, colm) // TrySync for the first table, add column b, should succeed, because this column is fully dropped in the downstream DDLs, cols, err = l.TrySync(newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs3, ti2, []*model.TableInfo{ti1}, vers), tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs3) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) - c.Assert(l.IsResolved(), check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(DDLs3, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) + t.Require().False(l.IsResolved()) // TrySync for the first table, add column c, should fail, because this column isn't fully dropped in the downstream _, _, err = l.TrySync(newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs4, ti1, []*model.TableInfo{ti0}, vers), tts) - c.Assert(err, check.ErrorMatches, ".*add column c that wasn't fully dropped in downstream.*") - c.Assert(l.IsResolved(), check.IsFalse) + t.Require().Error(err) + t.Require().Regexp(".*add column c that wasn't fully dropped in downstream.*", err.Error()) + t.Require().False(l.IsResolved()) // TrySync for the second table, drop column c, this column should be fully dropped DDLs, cols, err = l.TrySync(newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs1, ti3, []*model.TableInfo{ti2}, vers), tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{"c"}) - c.Assert(l.versions, check.DeepEquals, vers) - c.Assert(l.IsResolved(), check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{"c"}, cols) + t.Require().Equal(vers, l.versions) + t.Require().False(l.IsResolved()) // Simulate watch done operation from dm-worker op = NewOperation(utils.GenDDLLockID(task, downSchema, downTable), task, source, db, tbls[1], DDLs1, ConflictNone, "", true, []string{"c"}) - c.Assert(l.DeleteColumnsByOp(op), check.IsNil) + t.Require().NoError(l.DeleteColumnsByOp(op)) // TrySync for the second table, add column c, should fail, because this column isn't fully dropped in the downstream _, _, err = l.TrySync(newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs4, ti1, []*model.TableInfo{ti0}, vers), tts) - c.Assert(err, check.ErrorMatches, ".*add column c that wasn't fully dropped in downstream.*") - c.Assert(l.IsResolved(), check.IsFalse) + t.Require().Error(err) + t.Require().Regexp(".*add column c that wasn't fully dropped in downstream.*", err.Error()) + t.Require().False(l.IsResolved()) // Simulate watch done operation from dm-worker op = NewOperation(utils.GenDDLLockID(task, downSchema, downTable), task, source, db, tbls[0], []string{}, ConflictNone, "", true, []string{"c"}) - c.Assert(l.DeleteColumnsByOp(op), check.IsNil) + t.Require().NoError(l.DeleteColumnsByOp(op)) // TrySync for the first table, add column c, should succeed, because this column is fully dropped in the downstream DDLs, cols, err = l.TrySync(newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs4, ti1, []*model.TableInfo{ti0}, vers), tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs4) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) - c.Assert(l.IsResolved(), check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(DDLs4, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) + t.Require().False(l.IsResolved()) _, _, err = l.TrySync(newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs5, ti0, []*model.TableInfo{ti1, ti0}, vers), tts) - c.Assert(err, check.ErrorMatches, ".*add column c that wasn't fully dropped in downstream.*") + t.Require().Error(err) + t.Require().Regexp(".*add column c that wasn't fully dropped in downstream.*", err.Error()) } -func (t *testLock) trySyncForAllTablesLarger(c *check.C, l *Lock, +func (t *testLock) trySyncForAllTablesLarger(l *Lock, ddls []string, tableInfoBefore *model.TableInfo, tis []*model.TableInfo, tts []TargetTable, vers map[string]map[string]map[string]int64, ) { for source, schemaTables := range l.Ready() { @@ -1937,36 +1938,36 @@ func (t *testLock) trySyncForAllTablesLarger(c *check.C, l *Lock, for table := range tables { info := newInfoWithVersion(l.Task, source, schema, table, l.DownSchema, l.DownTable, ddls, tableInfoBefore, tis, vers) DDLs2, cols, err := l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(DDLs2, check.DeepEquals, ddls) + t.Require().NoError(err) + t.Require().Equal([]string{}, cols) + t.Require().Equal(ddls, DDLs2) } } } } -func (t *testLock) checkLockSynced(c *check.C, l *Lock) { +func (t *testLock) checkLockSynced(l *Lock) { synced, remain := l.IsSynced() - c.Assert(synced, check.Equals, l.synced) - c.Assert(synced, check.IsTrue) - c.Assert(remain, check.Equals, 0) + t.Require().Equal(l.synced, synced) + t.Require().True(synced) + t.Require().Equal(0, remain) ready := l.Ready() for _, schemaTables := range ready { for _, tables := range schemaTables { for _, synced := range tables { - c.Assert(synced, check.IsTrue) + t.Require().True(synced) } } } } -func (t *testLock) checkLockNoDone(c *check.C, l *Lock) { - c.Assert(l.IsResolved(), check.IsFalse) +func (t *testLock) checkLockNoDone(l *Lock) { + t.Require().False(l.IsResolved()) for source, schemaTables := range l.Ready() { for schema, tables := range schemaTables { for table := range tables { - c.Assert(l.IsDone(source, schema, table), check.IsFalse) + t.Require().False(l.IsDone(source, schema, table)) } } } @@ -1981,7 +1982,7 @@ func newInfoWithVersion(task, source, upSchema, upTable, downSchema, downTable s return info } -func (t *testLock) TestLockTrySyncDifferentIndex(c *check.C) { +func (t *testLock) TestLockTrySyncDifferentIndex() { var ( ID = "test_lock_try_sync_index-`foo`.`bar`" task = "test_lock_try_sync_index" @@ -1995,9 +1996,9 @@ func (t *testLock) TestLockTrySyncDifferentIndex(c *check.C) { tblID int64 = 111 DDLs1 = []string{"ALTER TABLE bar DROP INDEX idx_c1"} DDLs2 = []string{"ALTER TABLE bar ADD INDEX new_idx(c1)"} - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, UNIQUE INDEX idx_c1(c1))`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) - ti2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, INDEX new_idx(c1))`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, UNIQUE INDEX idx_c1(c1))`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT)`) + ti2 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, INDEX new_idx(c1))`) tables = map[string]map[string]struct{}{ db: {tbls[0]: struct{}{}, tbls[1]: struct{}{}}, } @@ -2015,56 +2016,56 @@ func (t *testLock) TestLockTrySyncDifferentIndex(c *check.C) { ) // the initial status is synced. - t.checkLockSynced(c, l) - t.checkLockNoDone(c, l) + t.checkLockSynced(l) + t.checkLockNoDone(l) // try sync for one table, `DROP INDEX` returned directly (to make schema become more compatible). // `DROP INDEX` is handled like `ADD COLUMN`. info := newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs1, ti0, []*model.TableInfo{ti1}, vers) DDLs, cols, err := l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs1) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal(DDLs1, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) synced, remain := l.IsSynced() - c.Assert(synced, check.Equals, l.synced) - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 1) + t.Require().Equal(l.synced, synced) + t.Require().False(synced) + t.Require().Equal(1, remain) cmp, err := l.tables[source][db][tbls[1]].Compare(schemacmp.Encode(ti0)) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) // try sync ADD another INDEX for another table // `ADD INDEX` is handled like `DROP COLUMN`. info = newInfoWithVersion(task, source, db, tbls[1], downSchema, downTable, DDLs2, ti1, []*model.TableInfo{ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, []string{}) // no DDLs returned - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) + t.Require().NoError(err) + t.Require().Equal([]string{}, DDLs) // no DDLs returned + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) synced, remain = l.IsSynced() - c.Assert(synced, check.Equals, l.synced) - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 1) + t.Require().Equal(l.synced, synced) + t.Require().False(synced) + t.Require().Equal(1, remain) joined, err := l.joinFinalTables() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = l.tables[source][db][tbls[0]].Compare(joined) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) // try sync ADD INDEX for first table info = newInfoWithVersion(task, source, db, tbls[0], downSchema, downTable, DDLs2, ti1, []*model.TableInfo{ti2}, vers) DDLs, cols, err = l.TrySync(info, tts) - c.Assert(err, check.IsNil) - c.Assert(DDLs, check.DeepEquals, DDLs2) - c.Assert(cols, check.DeepEquals, []string{}) - c.Assert(l.versions, check.DeepEquals, vers) - t.checkLockSynced(c, l) + t.Require().NoError(err) + t.Require().Equal(DDLs2, DDLs) + t.Require().Equal([]string{}, cols) + t.Require().Equal(vers, l.versions) + t.checkLockSynced(l) } -func (t *testLock) TestFetchTableInfo(c *check.C) { +func (t *testLock) TestFetchTableInfo() { var ( meta = "meta" ID = "test_lock_try_sync_index-`foo`.`bar`" @@ -2077,7 +2078,7 @@ func (t *testLock) TestFetchTableInfo(c *check.C) { p = parser.New() se = mock.NewContext() tblID int64 = 111 - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, UNIQUE INDEX idx_c1(c1))`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 INT, UNIQUE INDEX idx_c1(c1))`) tables = map[string]map[string]struct{}{ schema: {tbls[0]: struct{}{}, tbls[1]: struct{}{}}, } @@ -2090,40 +2091,40 @@ func (t *testLock) TestFetchTableInfo(c *check.C) { // nil downstream meta l := NewLock(etcdTestCli, ID, task, downSchema, downTable, schemacmp.Encode(ti0), tts, nil) ti, err := l.FetchTableInfos(task, source, schema, tbls[0]) - c.Assert(terror.ErrMasterOptimisticDownstreamMetaNotFound.Equal(err), check.IsTrue) - c.Assert(ti, check.IsNil) + t.Require().True(terror.ErrMasterOptimisticDownstreamMetaNotFound.Equal(err)) + t.Require().Nil(ti) // table info not exist l = NewLock(etcdTestCli, ID, task, downSchema, downTable, schemacmp.Encode(ti0), tts, &DownstreamMeta{dbConfig: &dbconfig.DBConfig{}, meta: meta}) conn.DefaultDBProvider = &conn.DefaultDBProviderImpl{} - mock := conn.InitMockDB(c) + mock := conn.InitMockDB(t.T()) mock.ExpectQuery(query).WithArgs(source, schema, tbls[0]).WillReturnRows(sqlmock.NewRows([]string{"table_info"})) ti, err = l.FetchTableInfos(task, source, schema, tbls[0]) - c.Assert(terror.ErrDBExecuteFailed.Equal(err), check.IsTrue) - c.Assert(ti, check.IsNil) + t.Require().True(terror.ErrDBExecuteFailed.Equal(err)) + t.Require().Nil(ti) // null table info l = NewLock(etcdTestCli, ID, task, downSchema, downTable, schemacmp.Encode(ti0), tts, &DownstreamMeta{dbConfig: &dbconfig.DBConfig{}, meta: meta}) conn.DefaultDBProvider = &conn.DefaultDBProviderImpl{} - mock = conn.InitMockDB(c) + mock = conn.InitMockDB(t.T()) mock.ExpectQuery(query).WithArgs(source, schema, tbls[0]).WillReturnRows(sqlmock.NewRows([]string{"table_info"}).AddRow("null")) ti, err = l.FetchTableInfos(task, source, schema, tbls[0]) - c.Assert(terror.ErrMasterOptimisticDownstreamMetaNotFound.Equal(err), check.IsTrue) - c.Assert(ti, check.IsNil) + t.Require().True(terror.ErrMasterOptimisticDownstreamMetaNotFound.Equal(err)) + t.Require().Nil(ti) // succeed tiBytes, err := json.Marshal(ti0) - c.Assert(err, check.IsNil) + t.Require().NoError(err) conn.DefaultDBProvider = &conn.DefaultDBProviderImpl{} - mock = conn.InitMockDB(c) + mock = conn.InitMockDB(t.T()) mock.ExpectQuery(query).WithArgs(source, schema, tbls[0]).WillReturnRows(sqlmock.NewRows([]string{"table_info"}).AddRow(tiBytes)) ti, err = l.FetchTableInfos(task, source, schema, tbls[0]) - c.Assert(err, check.IsNil) - c.Assert(mock.ExpectationsWereMet(), check.IsNil) - c.Assert(ti, check.DeepEquals, ti0) + t.Require().NoError(err) + t.Require().NoError(mock.ExpectationsWereMet()) + t.Require().Equal(ti0, ti) } -func (t *testLock) TestCheckAddDropColumns(c *check.C) { +func (t *testLock) TestCheckAddDropColumns() { var ( ID = "test-`foo`.`bar`" task = "test" @@ -2139,10 +2140,10 @@ func (t *testLock) TestCheckAddDropColumns(c *check.C) { DDLs2 = "ALTER TABLE bar ADD COLUMN a VARCHAR(2)" DDLs3 = "ALTER TABLE bar DROP COLUMN col" DDLs4 = "ALTER TABLE bar ADD COLUMN col int" - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int, a VARCHAR(1))`) - ti2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int, a VARCHAR(2))`) - ti3 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, a VARCHAR(2))`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int, a VARCHAR(1))`) + ti2 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int, a VARCHAR(2))`) + ti3 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, a VARCHAR(2))`) tables = map[string]map[string]struct{}{ db: {tbls[0]: struct{}{}, tbls[1]: struct{}{}}, } @@ -2158,18 +2159,19 @@ func (t *testLock) TestCheckAddDropColumns(c *check.C) { col, err := l.checkAddDropColumn(source, db, tbls[0], DDLs1, schemacmp.Encode(ti0), schemacmp.Encode(ti1), nil) - c.Assert(err, check.IsNil) - c.Assert(len(col), check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, len(col)) l.tables[source][db][tbls[0]] = schemacmp.Encode(ti1) col, err = l.checkAddDropColumn(source, db, tbls[1], DDLs2, schemacmp.Encode(ti0), schemacmp.Encode(ti2), nil) - c.Assert(err, check.NotNil) - c.Assert(err, check.ErrorMatches, ".*add columns with different field lengths.*") - c.Assert(len(col), check.Equals, 0) + t.Require().Error(err) + t.Require().Error(err) + t.Require().Regexp(".*add columns with different field lengths.*", err.Error()) + t.Require().Equal(0, len(col)) col, err = l.checkAddDropColumn(source, db, tbls[0], DDLs3, schemacmp.Encode(ti2), schemacmp.Encode(ti3), nil) - c.Assert(err, check.IsNil) - c.Assert(col, check.Equals, "col") + t.Require().NoError(err) + t.Require().Equal("col", col) l.columns = map[string]map[string]map[string]map[string]DropColumnStage{ "col": { @@ -2180,12 +2182,13 @@ func (t *testLock) TestCheckAddDropColumns(c *check.C) { } col, err = l.checkAddDropColumn(source, db, tbls[0], DDLs4, schemacmp.Encode(ti3), schemacmp.Encode(ti2), nil) - c.Assert(err, check.NotNil) - c.Assert(err, check.ErrorMatches, ".*add column .* that wasn't fully dropped in downstream.*") - c.Assert(len(col), check.Equals, 0) + t.Require().Error(err) + t.Require().Error(err) + t.Require().Regexp(".*add column .* that wasn't fully dropped in downstream.*", err.Error()) + t.Require().Equal(0, len(col)) } -func (t *testLock) TestJoinTables(c *check.C) { +func (t *testLock) TestJoinTables() { var ( source = "mysql-replica-1" db = "db" @@ -2193,9 +2196,9 @@ func (t *testLock) TestJoinTables(c *check.C) { p = parser.New() se = mock.NewContext() tblID int64 = 111 - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int, a VARCHAR(1))`) - ti2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col varchar(4))`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int, a VARCHAR(1))`) + ti2 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col varchar(4))`) t0 = schemacmp.Encode(ti0) t1 = schemacmp.Encode(ti1) t2 = schemacmp.Encode(ti2) @@ -2215,33 +2218,33 @@ func (t *testLock) TestJoinTables(c *check.C) { } joined, err := l.joinNormalTables() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err := joined.Compare(t0) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) joined, err = l.joinFinalTables() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = joined.Compare(t0) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) _, err = l.joinConflictTables() - c.Assert(err, check.IsNil) + t.Require().NoError(err) l.tables[source][db][tbls[0]] = t1 l.finalTables[source][db][tbls[0]] = t1 joined, err = l.joinNormalTables() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = joined.Compare(t1) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) joined, err = l.joinFinalTables() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = joined.Compare(t1) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) _, err = l.joinConflictTables() - c.Assert(err, check.IsNil) + t.Require().NoError(err) l.tables[source][db][tbls[1]] = t1 l.finalTables[source][db][tbls[1]] = t1 @@ -2252,32 +2255,33 @@ func (t *testLock) TestJoinTables(c *check.C) { } joined, err = l.joinNormalTables() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = joined.Compare(t1) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) joined, err = l.joinFinalTables() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = joined.Compare(t1) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) joined, err = l.joinConflictTables() - c.Assert(err, check.IsNil) + t.Require().NoError(err) cmp, err = joined.Compare(t2) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) l.tables[source][db][tbls[1]] = t2 _, err = l.joinNormalTables() - c.Assert(err, check.NotNil) - c.Assert(err, check.ErrorMatches, ".*incompatible mysql type.*") + t.Require().Error(err) + t.Require().Error(err) + t.Require().Regexp(".*incompatible mysql type.*", err.Error()) l.resolveTables() - c.Assert(l.conflictTables, check.HasLen, 0) - c.Assert(l.tables, check.DeepEquals, l.finalTables) + t.Require().Len(l.conflictTables, 0) + t.Require().Equal(l.finalTables, l.tables) } -func (t *testLock) TestAddRemoveConflictTable(c *check.C) { +func (t *testLock) TestAddRemoveConflictTable() { var ( source = "source" schema = "schema" @@ -2287,52 +2291,52 @@ func (t *testLock) TestAddRemoveConflictTable(c *check.C) { p = parser.New() se = mock.NewContext() tblID int64 = 111 - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int)`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int)`) t0 = schemacmp.Encode(ti0) ) l := &Lock{ conflictTables: make(map[string]map[string]map[string]schemacmp.Table), } - c.Assert(l.conflictTables, check.HasLen, 0) + t.Require().Len(l.conflictTables, 0) l.addConflictTable(source, schema, table1, t0) - c.Assert(l.conflictTables, check.HasLen, 1) - c.Assert(l.conflictTables[source], check.HasLen, 1) - c.Assert(l.conflictTables[source][schema], check.HasLen, 1) + t.Require().Len(l.conflictTables, 1) + t.Require().Len(l.conflictTables[source], 1) + t.Require().Len(l.conflictTables[source][schema], 1) tb := l.conflictTables[source][schema][table1] cmp, err := tb.Compare(t0) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) l.addConflictTable(source, schema, table1, t0) - c.Assert(l.conflictTables, check.HasLen, 1) - c.Assert(l.conflictTables[source], check.HasLen, 1) - c.Assert(l.conflictTables[source][schema], check.HasLen, 1) + t.Require().Len(l.conflictTables, 1) + t.Require().Len(l.conflictTables[source], 1) + t.Require().Len(l.conflictTables[source][schema], 1) l.addConflictTable(source, schema, table2, t0) - c.Assert(l.conflictTables, check.HasLen, 1) - c.Assert(l.conflictTables[source], check.HasLen, 1) - c.Assert(l.conflictTables[source][schema], check.HasLen, 2) + t.Require().Len(l.conflictTables, 1) + t.Require().Len(l.conflictTables[source], 1) + t.Require().Len(l.conflictTables[source][schema], 2) tb = l.conflictTables[source][schema][table2] cmp, err = tb.Compare(t0) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) l.removeConflictTable(source, schema, table3) - c.Assert(l.conflictTables[source][schema], check.HasLen, 2) + t.Require().Len(l.conflictTables[source][schema], 2) l.removeConflictTable(source, schema, table1) - c.Assert(l.conflictTables[source][schema], check.HasLen, 1) + t.Require().Len(l.conflictTables[source][schema], 1) tb = l.conflictTables[source][schema][table2] cmp, err = tb.Compare(t0) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + t.Require().NoError(err) + t.Require().Equal(0, cmp) l.removeConflictTable(source, schema, table2) - c.Assert(l.conflictTables, check.HasLen, 0) + t.Require().Len(l.conflictTables, 0) } -func (t *testLock) TestAllTableSmallerLarger(c *check.C) { +func (t *testLock) TestAllTableSmallerLarger() { var ( source = "source" schema = "schema" @@ -2341,16 +2345,16 @@ func (t *testLock) TestAllTableSmallerLarger(c *check.C) { p = parser.New() se = mock.NewContext() tblID int64 = 111 - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, new_col int)`) - ti2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, new_col varchar(4))`) - ti3 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (a INT PRIMARY KEY, new_col varchar(4))`) - ti4 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, new_col2 varchar(4))`) - ti5 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id varchar(4) PRIMARY KEY, new_col int)`) - ti6 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int, new_col int)`) - ti7 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int, new_col varchar(4))`) - ti8 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int, col2 int not null)`) - ti9 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (a INT PRIMARY KEY, new_col int)`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, new_col int)`) + ti2 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, new_col varchar(4))`) + ti3 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (a INT PRIMARY KEY, new_col varchar(4))`) + ti4 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, new_col2 varchar(4))`) + ti5 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id varchar(4) PRIMARY KEY, new_col int)`) + ti6 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int, new_col int)`) + ti7 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int, new_col varchar(4))`) + ti8 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col int, col2 int not null)`) + ti9 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (a INT PRIMARY KEY, new_col int)`) t0 = schemacmp.Encode(ti0) t1 = schemacmp.Encode(ti1) t2 = schemacmp.Encode(ti2) @@ -2375,245 +2379,245 @@ func (t *testLock) TestAllTableSmallerLarger(c *check.C) { }, conflictTables: make(map[string]map[string]map[string]schemacmp.Table), } - c.Assert(l.allFinalTableSmaller(), check.IsTrue) + t.Require().True(l.allFinalTableSmaller()) // rename table l.addConflictTable(source, schema, table1, t1) l.finalTables[source][schema][table1] = t1 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsFalse) - c.Assert(l.allFinalTableLarger(), check.IsFalse) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().False(l.allFinalTableSmaller()) + t.Require().False(l.allFinalTableLarger()) l.addConflictTable(source, schema, table2, t1) l.finalTables[source][schema][table2] = t1 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsTrue) - c.Assert(l.allFinalTableLarger(), check.IsTrue) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().True(l.allFinalTableSmaller()) + t.Require().True(l.allFinalTableLarger()) // reset l.resolveTables() - c.Assert(l.conflictTables, check.HasLen, 0) - c.Assert(l.tables, check.DeepEquals, l.finalTables) - c.Assert(l.tables[source][schema], check.HasLen, 2) + t.Require().Len(l.conflictTables, 0) + t.Require().Equal(l.finalTables, l.tables) + t.Require().Len(l.tables[source][schema], 2) // modify column l.addConflictTable(source, schema, table1, t2) l.finalTables[source][schema][table1] = t2 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsFalse) - c.Assert(l.allFinalTableLarger(), check.IsFalse) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().False(l.allFinalTableSmaller()) + t.Require().False(l.allFinalTableLarger()) l.addConflictTable(source, schema, table2, t2) l.finalTables[source][schema][table2] = t2 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsTrue) - c.Assert(l.allFinalTableLarger(), check.IsTrue) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().True(l.allFinalTableSmaller()) + t.Require().True(l.allFinalTableLarger()) // reset l.resolveTables() - c.Assert(l.conflictTables, check.HasLen, 0) - c.Assert(l.tables, check.DeepEquals, l.finalTables) - c.Assert(l.tables[source][schema], check.HasLen, 2) - c.Assert(l.tables[source][schema][table1], check.DeepEquals, t2) - c.Assert(l.tables[source][schema][table2], check.DeepEquals, t2) + t.Require().Len(l.conflictTables, 0) + t.Require().Equal(l.finalTables, l.tables) + t.Require().Len(l.tables[source][schema], 2) + t.Require().Equal(t2, l.tables[source][schema][table1]) + t.Require().Equal(t2, l.tables[source][schema][table2]) // different rename l.addConflictTable(source, schema, table1, t3) l.finalTables[source][schema][table1] = t3 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsFalse) - c.Assert(l.allFinalTableLarger(), check.IsFalse) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().False(l.allFinalTableSmaller()) + t.Require().False(l.allFinalTableLarger()) l.addConflictTable(source, schema, table2, t4) l.finalTables[source][schema][table2] = t4 - c.Assert(l.allConflictTableSmaller(), check.IsFalse) - c.Assert(l.allConflictTableLarger(), check.IsFalse) - c.Assert(l.allFinalTableSmaller(), check.IsFalse) - c.Assert(l.allFinalTableLarger(), check.IsFalse) + t.Require().False(l.allConflictTableSmaller()) + t.Require().False(l.allConflictTableLarger()) + t.Require().False(l.allFinalTableSmaller()) + t.Require().False(l.allFinalTableLarger()) // reset l.finalTables[source][schema][table1] = t1 l.finalTables[source][schema][table2] = t1 l.resolveTables() - c.Assert(l.conflictTables, check.HasLen, 0) - c.Assert(l.tables, check.DeepEquals, l.finalTables) - c.Assert(l.tables[source][schema], check.HasLen, 2) - c.Assert(l.tables[source][schema][table1], check.DeepEquals, t1) - c.Assert(l.tables[source][schema][table2], check.DeepEquals, t1) + t.Require().Len(l.conflictTables, 0) + t.Require().Equal(l.finalTables, l.tables) + t.Require().Len(l.tables[source][schema], 2) + t.Require().Equal(t1, l.tables[source][schema][table1]) + t.Require().Equal(t1, l.tables[source][schema][table2]) // different modify l.addConflictTable(source, schema, table1, t2) l.finalTables[source][schema][table1] = t2 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsFalse) - c.Assert(l.allFinalTableLarger(), check.IsFalse) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().False(l.allFinalTableSmaller()) + t.Require().False(l.allFinalTableLarger()) l.addConflictTable(source, schema, table2, t5) l.finalTables[source][schema][table2] = t5 - c.Assert(l.allConflictTableSmaller(), check.IsFalse) - c.Assert(l.allConflictTableLarger(), check.IsFalse) - c.Assert(l.allFinalTableSmaller(), check.IsFalse) - c.Assert(l.allFinalTableLarger(), check.IsFalse) + t.Require().False(l.allConflictTableSmaller()) + t.Require().False(l.allConflictTableLarger()) + t.Require().False(l.allFinalTableSmaller()) + t.Require().False(l.allFinalTableLarger()) // reset l.finalTables[source][schema][table1] = t1 l.finalTables[source][schema][table2] = t1 l.resolveTables() - c.Assert(l.conflictTables, check.HasLen, 0) - c.Assert(l.tables, check.DeepEquals, l.finalTables) - c.Assert(l.tables[source][schema], check.HasLen, 2) - c.Assert(l.tables[source][schema][table1], check.DeepEquals, t1) - c.Assert(l.tables[source][schema][table2], check.DeepEquals, t1) + t.Require().Len(l.conflictTables, 0) + t.Require().Equal(l.finalTables, l.tables) + t.Require().Len(l.tables[source][schema], 2) + t.Require().Equal(t1, l.tables[source][schema][table1]) + t.Require().Equal(t1, l.tables[source][schema][table2]) // one table rename, one table modify l.addConflictTable(source, schema, table1, t4) l.finalTables[source][schema][table1] = t4 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsFalse) - c.Assert(l.allFinalTableLarger(), check.IsFalse) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().False(l.allFinalTableSmaller()) + t.Require().False(l.allFinalTableLarger()) l.addConflictTable(source, schema, table2, t5) l.finalTables[source][schema][table2] = t5 - c.Assert(l.allConflictTableSmaller(), check.IsFalse) - c.Assert(l.allConflictTableLarger(), check.IsFalse) - c.Assert(l.allFinalTableSmaller(), check.IsFalse) - c.Assert(l.allFinalTableLarger(), check.IsFalse) + t.Require().False(l.allConflictTableSmaller()) + t.Require().False(l.allConflictTableLarger()) + t.Require().False(l.allFinalTableSmaller()) + t.Require().False(l.allFinalTableLarger()) // reset l.finalTables[source][schema][table1] = t0 l.finalTables[source][schema][table2] = t0 l.resolveTables() - c.Assert(l.conflictTables, check.HasLen, 0) - c.Assert(l.tables, check.DeepEquals, l.finalTables) - c.Assert(l.tables[source][schema], check.HasLen, 2) - c.Assert(l.tables[source][schema][table1], check.DeepEquals, t0) - c.Assert(l.tables[source][schema][table2], check.DeepEquals, t0) + t.Require().Len(l.conflictTables, 0) + t.Require().Equal(l.finalTables, l.tables) + t.Require().Len(l.tables[source][schema], 2) + t.Require().Equal(t0, l.tables[source][schema][table1]) + t.Require().Equal(t0, l.tables[source][schema][table2]) // one table rename, one table add and drop l.addConflictTable(source, schema, table1, t1) l.finalTables[source][schema][table1] = t1 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsFalse) - c.Assert(l.allFinalTableLarger(), check.IsFalse) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().False(l.allFinalTableSmaller()) + t.Require().False(l.allFinalTableLarger()) l.finalTables[source][schema][table2] = t6 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsFalse) - c.Assert(l.allFinalTableLarger(), check.IsTrue) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().False(l.allFinalTableSmaller()) + t.Require().True(l.allFinalTableLarger()) l.finalTables[source][schema][table2] = t1 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsTrue) - c.Assert(l.allFinalTableLarger(), check.IsTrue) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().True(l.allFinalTableSmaller()) + t.Require().True(l.allFinalTableLarger()) // reset l.finalTables[source][schema][table1] = t0 l.finalTables[source][schema][table2] = t0 l.resolveTables() - c.Assert(l.conflictTables, check.HasLen, 0) - c.Assert(l.tables, check.DeepEquals, l.finalTables) - c.Assert(l.tables[source][schema], check.HasLen, 2) - c.Assert(l.tables[source][schema][table1], check.DeepEquals, t0) - c.Assert(l.tables[source][schema][table2], check.DeepEquals, t0) + t.Require().Len(l.conflictTables, 0) + t.Require().Equal(l.finalTables, l.tables) + t.Require().Len(l.tables[source][schema], 2) + t.Require().Equal(t0, l.tables[source][schema][table1]) + t.Require().Equal(t0, l.tables[source][schema][table2]) // one table modify, one table add and drop l.addConflictTable(source, schema, table1, t2) l.finalTables[source][schema][table1] = t2 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsFalse) - c.Assert(l.allFinalTableLarger(), check.IsFalse) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().False(l.allFinalTableSmaller()) + t.Require().False(l.allFinalTableLarger()) l.finalTables[source][schema][table2] = t7 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsFalse) - c.Assert(l.allFinalTableLarger(), check.IsTrue) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().False(l.allFinalTableSmaller()) + t.Require().True(l.allFinalTableLarger()) l.finalTables[source][schema][table2] = t2 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsTrue) - c.Assert(l.allFinalTableLarger(), check.IsTrue) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().True(l.allFinalTableSmaller()) + t.Require().True(l.allFinalTableLarger()) // reset l.finalTables[source][schema][table1] = t0 l.finalTables[source][schema][table2] = t0 l.resolveTables() - c.Assert(l.conflictTables, check.HasLen, 0) - c.Assert(l.tables, check.DeepEquals, l.finalTables) - c.Assert(l.tables[source][schema], check.HasLen, 2) - c.Assert(l.tables[source][schema][table1], check.DeepEquals, t0) - c.Assert(l.tables[source][schema][table2], check.DeepEquals, t0) + t.Require().Len(l.conflictTables, 0) + t.Require().Equal(l.finalTables, l.tables) + t.Require().Len(l.tables[source][schema], 2) + t.Require().Equal(t0, l.tables[source][schema][table1]) + t.Require().Equal(t0, l.tables[source][schema][table2]) // not null no default l.addConflictTable(source, schema, table1, t8) l.finalTables[source][schema][table1] = t8 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsFalse) - c.Assert(l.allFinalTableLarger(), check.IsFalse) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().False(l.allFinalTableSmaller()) + t.Require().False(l.allFinalTableLarger()) l.addConflictTable(source, schema, table2, t8) l.finalTables[source][schema][table2] = t8 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsTrue) - c.Assert(l.allFinalTableLarger(), check.IsTrue) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().True(l.allFinalTableSmaller()) + t.Require().True(l.allFinalTableLarger()) // reset l.finalTables[source][schema][table1] = t0 l.finalTables[source][schema][table2] = t0 l.resolveTables() - c.Assert(l.conflictTables, check.HasLen, 0) - c.Assert(l.tables, check.DeepEquals, l.finalTables) - c.Assert(l.tables[source][schema], check.HasLen, 2) - c.Assert(l.tables[source][schema][table1], check.DeepEquals, t0) - c.Assert(l.tables[source][schema][table2], check.DeepEquals, t0) + t.Require().Len(l.conflictTables, 0) + t.Require().Equal(l.finalTables, l.tables) + t.Require().Len(l.tables[source][schema], 2) + t.Require().Equal(t0, l.tables[source][schema][table1]) + t.Require().Equal(t0, l.tables[source][schema][table2]) // multiple rename // tb1: rename col to new_col l.addConflictTable(source, schema, table1, t1) l.finalTables[source][schema][table1] = t1 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsFalse) - c.Assert(l.allFinalTableLarger(), check.IsFalse) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().False(l.allFinalTableSmaller()) + t.Require().False(l.allFinalTableLarger()) // tb2: rename col to new_col l.addConflictTable(source, schema, table2, t1) l.finalTables[source][schema][table2] = t1 - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsTrue) - c.Assert(l.allFinalTableLarger(), check.IsTrue) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().True(l.allFinalTableSmaller()) + t.Require().True(l.allFinalTableLarger()) l.resolveTables() // tb1: rename id to a l.addConflictTable(source, schema, table1, t9) l.finalTables[source][schema][table1] = t9 - c.Assert(l.noConflictWithOneNormalTable(source, schema, table1, t1, t9), check.IsFalse) - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsFalse) - c.Assert(l.allFinalTableLarger(), check.IsFalse) + t.Require().False(l.noConflictWithOneNormalTable(source, schema, table1, t1, t9)) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().False(l.allFinalTableSmaller()) + t.Require().False(l.allFinalTableLarger()) // tb2: rename col to new_col (idempotent) l.tables[source][schema][table2] = t0 l.addConflictTable(source, schema, table2, t1) l.finalTables[source][schema][table2] = t1 - c.Assert(l.noConflictWithOneNormalTable(source, schema, table2, t0, t1), check.IsTrue) + t.Require().True(l.noConflictWithOneNormalTable(source, schema, table2, t0, t1)) l.removeConflictTable(source, schema, table2) l.tables[source][schema][table2] = t1 // tb2: rename id to a l.addConflictTable(source, schema, table2, t9) l.finalTables[source][schema][table2] = t9 - c.Assert(l.noConflictWithOneNormalTable(source, schema, table2, t1, t9), check.IsFalse) - c.Assert(l.allConflictTableSmaller(), check.IsTrue) - c.Assert(l.allConflictTableLarger(), check.IsTrue) - c.Assert(l.allFinalTableSmaller(), check.IsTrue) - c.Assert(l.allFinalTableLarger(), check.IsTrue) + t.Require().False(l.noConflictWithOneNormalTable(source, schema, table2, t1, t9)) + t.Require().True(l.allConflictTableSmaller()) + t.Require().True(l.allConflictTableLarger()) + t.Require().True(l.allFinalTableSmaller()) + t.Require().True(l.allFinalTableLarger()) // reset l.finalTables[source][schema][table1] = t0 l.finalTables[source][schema][table2] = t0 l.resolveTables() - c.Assert(l.conflictTables, check.HasLen, 0) - c.Assert(l.tables, check.DeepEquals, l.finalTables) - c.Assert(l.tables[source][schema], check.HasLen, 2) - c.Assert(l.tables[source][schema][table1], check.DeepEquals, t0) - c.Assert(l.tables[source][schema][table2], check.DeepEquals, t0) + t.Require().Len(l.conflictTables, 0) + t.Require().Equal(l.finalTables, l.tables) + t.Require().Len(l.tables[source][schema], 2) + t.Require().Equal(t0, l.tables[source][schema][table1]) + t.Require().Equal(t0, l.tables[source][schema][table2]) } -func (t *testLock) TestNoConflictWithOneNormalTable(c *check.C) { +func (t *testLock) TestNoConflictWithOneNormalTable() { var ( source = "source" schema = "schema" @@ -2622,11 +2626,11 @@ func (t *testLock) TestNoConflictWithOneNormalTable(c *check.C) { p = parser.New() se = mock.NewContext() tblID int64 = 111 - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, a int, col int)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, a int, new_col int)`) - ti2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, a int, col varchar(4))`) - ti3 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, a int, new_col2 int)`) - ti4 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, b int, new_col int)`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, a int, col int)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, a int, new_col int)`) + ti2 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, a int, col varchar(4))`) + ti3 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, a int, new_col2 int)`) + ti4 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, b int, new_col int)`) t0 = schemacmp.Encode(ti0) t1 = schemacmp.Encode(ti1) t2 = schemacmp.Encode(ti2) @@ -2643,31 +2647,31 @@ func (t *testLock) TestNoConflictWithOneNormalTable(c *check.C) { // table1 nothing happened. // table2 rename column - c.Assert(l.noConflictWithOneNormalTable(source, schema, table2, t0, t1), check.IsFalse) + t.Require().False(l.noConflictWithOneNormalTable(source, schema, table2, t0, t1)) // mock table1 rename column already l.tables[source][schema][table1] = t1 // table2 rename column - c.Assert(l.noConflictWithOneNormalTable(source, schema, table2, t0, t1), check.IsTrue) + t.Require().True(l.noConflictWithOneNormalTable(source, schema, table2, t0, t1)) // table2 modify column - c.Assert(l.noConflictWithOneNormalTable(source, schema, table2, t0, t2), check.IsFalse) + t.Require().False(l.noConflictWithOneNormalTable(source, schema, table2, t0, t2)) // table2 different rename - c.Assert(l.noConflictWithOneNormalTable(source, schema, table2, t0, t3), check.IsFalse) + t.Require().False(l.noConflictWithOneNormalTable(source, schema, table2, t0, t3)) // mock table1 rename another column already l.tables[source][schema][table1] = t4 // same results // table2 rename column - c.Assert(l.noConflictWithOneNormalTable(source, schema, table2, t0, t1), check.IsTrue) + t.Require().True(l.noConflictWithOneNormalTable(source, schema, table2, t0, t1)) // table2 modify column - c.Assert(l.noConflictWithOneNormalTable(source, schema, table2, t0, t2), check.IsFalse) + t.Require().False(l.noConflictWithOneNormalTable(source, schema, table2, t0, t2)) // table2 different rename - c.Assert(l.noConflictWithOneNormalTable(source, schema, table2, t0, t3), check.IsFalse) + t.Require().False(l.noConflictWithOneNormalTable(source, schema, table2, t0, t3)) } -func checkRedirectOp(c *check.C, task, source, schema, table string) bool { +func checkRedirectOp(t *testing.T, task, source, schema, table string) bool { ops, _, err := GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) + require.NoError(t, err) if _, ok := ops[task]; !ok { return false } @@ -2684,7 +2688,7 @@ func checkRedirectOp(c *check.C, task, source, schema, table string) bool { return op.ConflictStage == ConflictResolved } -func (t *testLock) TestTrySyncForOneDDL(c *check.C) { +func (t *testLock) TestTrySyncForOneDDL() { var ( ID = "test-`foo`.`bar`" task = "test" @@ -2697,17 +2701,17 @@ func (t *testLock) TestTrySyncForOneDDL(c *check.C) { p = parser.New() se = mock.NewContext() tblID int64 = 111 - ti0 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col1 int)`) - ti1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col1 int, col2 int)`) - ti2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - ti3 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col1 int, col3 int)`) - ti4 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col2 int)`) - ti5 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col3 int)`) - ti6 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col3 varchar(4))`) - ti7 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col3 int)`) - ti8 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col3 varchar(4), col4 int not null)`) - ti9 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col2 varchar(4), col4 int not null)`) - ti10 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col3 int, col4 int not null)`) + ti0 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col1 int)`) + ti1 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col1 int, col2 int)`) + ti2 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + ti3 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col1 int, col3 int)`) + ti4 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col2 int)`) + ti5 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col3 int)`) + ti6 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col3 varchar(4))`) + ti7 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col3 int)`) + ti8 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col3 varchar(4), col4 int not null)`) + ti9 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col2 varchar(4), col4 int not null)`) + ti10 = createTableInfo(t.T(), p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, col3 int, col4 int not null)`) t0 = schemacmp.Encode(ti0) t1 = schemacmp.Encode(ti1) t2 = schemacmp.Encode(ti2) @@ -2730,84 +2734,84 @@ func (t *testLock) TestTrySyncForOneDDL(c *check.C) { // check create table statement schemaChanged, conflictStage := l.trySyncForOneDDL(source, schema, table1, t0, t0) - c.Assert(schemaChanged, check.IsTrue) - c.Assert(conflictStage, check.Equals, ConflictNone) + t.Require().True(schemaChanged) + t.Require().Equal(ConflictNone, conflictStage) // check alter table add column schemaChanged, conflictStage = l.trySyncForOneDDL(source, schema, table1, t0, t1) - c.Assert(schemaChanged, check.IsTrue) - c.Assert(conflictStage, check.Equals, ConflictNone) + t.Require().True(schemaChanged) + t.Require().Equal(ConflictNone, conflictStage) // check create partition, no changed since https://github.com/pingcap/tidb/blob/42075e6ad60ba5d1f860ac845908f0c34ac28253/pkg/util/schemacmp/table.go#L256 schemaChanged, conflictStage = l.trySyncForOneDDL(source, schema, table1, t0, t1) - c.Assert(schemaChanged, check.IsTrue) - c.Assert(conflictStage, check.Equals, ConflictNone) + t.Require().True(schemaChanged) + t.Require().Equal(ConflictNone, conflictStage) // check alter table drop column schemaChanged, conflictStage = l.trySyncForOneDDL(source, schema, table2, t0, t2) - c.Assert(schemaChanged, check.IsFalse) - c.Assert(conflictStage, check.Equals, ConflictNone) + t.Require().False(schemaChanged) + t.Require().Equal(ConflictNone, conflictStage) // check table rename column schemaChanged, conflictStage = l.trySyncForOneDDL(source, schema, table1, t1, t3) - c.Assert(schemaChanged, check.IsFalse) - c.Assert(conflictStage, check.Equals, ConflictSkipWaitRedirect) + t.Require().False(schemaChanged) + t.Require().Equal(ConflictSkipWaitRedirect, conflictStage) // check other table add column schemaChanged, conflictStage = l.trySyncForOneDDL(source, schema, table2, t2, t4) - c.Assert(schemaChanged, check.IsTrue) - c.Assert(conflictStage, check.Equals, ConflictNone) + t.Require().True(schemaChanged) + t.Require().Equal(ConflictNone, conflictStage) // check all table rename column schemaChanged, conflictStage = l.trySyncForOneDDL(source, schema, table2, t4, t5) - c.Assert(schemaChanged, check.IsTrue) - c.Assert(conflictStage, check.Equals, ConflictNone) + t.Require().True(schemaChanged) + t.Require().Equal(ConflictNone, conflictStage) // table1 redirect - c.Assert(checkRedirectOp(c, task, source, schema, table1), check.IsTrue) + t.Require().True(checkRedirectOp(t.T(), task, source, schema, table1)) // check one table modify column schemaChanged, conflictStage = l.trySyncForOneDDL(source, schema, table2, t5, t6) - c.Assert(schemaChanged, check.IsFalse) - c.Assert(conflictStage, check.Equals, ConflictSkipWaitRedirect) + t.Require().False(schemaChanged) + t.Require().Equal(ConflictSkipWaitRedirect, conflictStage) // check other table drop column schemaChanged, conflictStage = l.trySyncForOneDDL(source, schema, table1, t3, t7) - c.Assert(schemaChanged, check.IsTrue) - c.Assert(conflictStage, check.Equals, ConflictNone) + t.Require().True(schemaChanged) + t.Require().Equal(ConflictNone, conflictStage) // check all table modify column schemaChanged, conflictStage = l.trySyncForOneDDL(source, schema, table1, t7, t6) - c.Assert(schemaChanged, check.IsTrue) - c.Assert(conflictStage, check.Equals, ConflictNone) + t.Require().True(schemaChanged) + t.Require().Equal(ConflictNone, conflictStage) // table2 redirect - c.Assert(checkRedirectOp(c, task, source, schema, table2), check.IsTrue) + t.Require().True(checkRedirectOp(t.T(), task, source, schema, table2)) // check add column not null no default schemaChanged, conflictStage = l.trySyncForOneDDL(source, schema, table1, t6, t8) - c.Assert(schemaChanged, check.IsFalse) - c.Assert(conflictStage, check.Equals, ConflictSkipWaitRedirect) + t.Require().False(schemaChanged) + t.Require().Equal(ConflictSkipWaitRedirect, conflictStage) // check idempotent. schemaChanged, conflictStage = l.trySyncForOneDDL(source, schema, table1, t6, t8) - c.Assert(schemaChanged, check.IsFalse) - c.Assert(conflictStage, check.Equals, ConflictSkipWaitRedirect) + t.Require().False(schemaChanged) + t.Require().Equal(ConflictSkipWaitRedirect, conflictStage) schemaChanged, conflictStage = l.trySyncForOneDDL(source, schema, table2, t6, t8) - c.Assert(schemaChanged, check.IsTrue) - c.Assert(conflictStage, check.Equals, ConflictNone) + t.Require().True(schemaChanged) + t.Require().Equal(ConflictNone, conflictStage) // table1 redirect - c.Assert(checkRedirectOp(c, task, source, schema, table2), check.IsTrue) + t.Require().True(checkRedirectOp(t.T(), task, source, schema, table2)) // check idempotent. schemaChanged, conflictStage = l.trySyncForOneDDL(source, schema, table2, t6, t8) - c.Assert(schemaChanged, check.IsTrue) - c.Assert(conflictStage, check.Equals, ConflictNone) + t.Require().True(schemaChanged) + t.Require().Equal(ConflictNone, conflictStage) // check multiple conflict DDL // tb1 rename column schemaChanged, conflictStage = l.trySyncForOneDDL(source, schema, table1, t8, t9) - c.Assert(schemaChanged, check.IsFalse) - c.Assert(conflictStage, check.Equals, ConflictSkipWaitRedirect) + t.Require().False(schemaChanged) + t.Require().Equal(ConflictSkipWaitRedirect, conflictStage) // tb2 modify column schemaChanged, conflictStage = l.trySyncForOneDDL(source, schema, table2, t8, t10) - c.Assert(schemaChanged, check.IsFalse) - c.Assert(conflictStage, check.Equals, ConflictDetected) + t.Require().False(schemaChanged) + t.Require().Equal(ConflictDetected, conflictStage) } diff --git a/dm/pkg/shardddl/optimism/operation_test.go b/dm/pkg/shardddl/optimism/operation_test.go index 9333faacde..c57192bb54 100644 --- a/dm/pkg/shardddl/optimism/operation_test.go +++ b/dm/pkg/shardddl/optimism/operation_test.go @@ -15,28 +15,29 @@ package optimism import ( "context" + "testing" "time" - "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -func (t *testForEtcd) TestOperationJSON(c *check.C) { +func TestOperationJSON(t *testing.T) { o1 := NewOperation("test-ID", "test", "mysql-replica-1", "db-1", "tbl-1", []string{ "ALTER TABLE tbl ADD COLUMN c1 INT", }, ConflictDetected, "conflict", true, []string{}) j, err := o1.toJSON() - c.Assert(err, check.IsNil) - c.Assert(j, check.Equals, `{"id":"test-ID","task":"test","source":"mysql-replica-1","up-schema":"db-1","up-table":"tbl-1","ddls":["ALTER TABLE tbl ADD COLUMN c1 INT"],"conflict-stage":"detected","conflict-message":"conflict","done":true,"cols":[]}`) - c.Assert(j, check.Equals, o1.String()) + require.NoError(t, err) + require.Equal(t, `{"id":"test-ID","task":"test","source":"mysql-replica-1","up-schema":"db-1","up-table":"tbl-1","ddls":["ALTER TABLE tbl ADD COLUMN c1 INT"],"conflict-stage":"detected","conflict-message":"conflict","done":true,"cols":[]}`, j) + require.Equal(t, o1.String(), j) o2, err := operationFromJSON(j) - c.Assert(err, check.IsNil) - c.Assert(o2, check.DeepEquals, o1) + require.NoError(t, err) + require.Equal(t, o1, o2) } -func (t *testForEtcd) TestOperationEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func TestOperationEtcd(t *testing.T) { + defer clearTestInfoOperation(t) var ( watchTimeout = 2 * time.Second @@ -54,12 +55,12 @@ func (t *testForEtcd) TestOperationEtcd(c *check.C) { // put the same keys twice. rev1, succ, err := PutOperation(etcdTestCli, false, op11, 0) - c.Assert(err, check.IsNil) - c.Assert(succ, check.IsTrue) + require.NoError(t, err) + require.True(t, succ) rev2, succ, err := PutOperation(etcdTestCli, false, op11, 0) - c.Assert(err, check.IsNil) - c.Assert(succ, check.IsTrue) - c.Assert(rev2, check.Greater, rev1) + require.NoError(t, err) + require.True(t, succ) + require.Greater(t, rev2, rev1) // start the watcher with the same revision as the last PUT for the specified task and source. wch := make(chan Operation, 10) @@ -71,15 +72,15 @@ func (t *testForEtcd) TestOperationEtcd(c *check.C) { close(ech) // watch should only get op11. - c.Assert(len(ech), check.Equals, 0) - c.Assert(len(wch), check.Equals, 1) + require.Equal(t, 0, len(ech)) + require.Equal(t, 1, len(wch)) op11.Revision = rev2 - c.Assert(<-wch, check.DeepEquals, op11) + require.Equal(t, op11, <-wch) // put for another task. rev3, succ, err := PutOperation(etcdTestCli, false, op21, 0) - c.Assert(err, check.IsNil) - c.Assert(succ, check.IsTrue) + require.NoError(t, err) + require.True(t, succ) // start the watch with an older revision for all tasks and sources. wch = make(chan Operation, 10) @@ -91,75 +92,75 @@ func (t *testForEtcd) TestOperationEtcd(c *check.C) { close(ech) // watch should get 2 operations. - c.Assert(len(ech), check.Equals, 0) - c.Assert(len(wch), check.Equals, 2) - c.Assert(<-wch, check.DeepEquals, op11) + require.Equal(t, 0, len(ech)) + require.Equal(t, 2, len(wch)) + require.Equal(t, op11, <-wch) op21.Revision = rev3 - c.Assert(<-wch, check.DeepEquals, op21) + require.Equal(t, op21, <-wch) // get all operations. opm, rev4, err := GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Equals, rev3) - c.Assert(opm, check.HasLen, 2) - c.Assert(opm, check.HasKey, task1) - c.Assert(opm, check.HasKey, task2) - c.Assert(opm[task1], check.HasLen, 1) + require.NoError(t, err) + require.Equal(t, rev3, rev4) + require.Len(t, opm, 2) + require.Contains(t, opm, task1) + require.Contains(t, opm, task2) + require.Len(t, opm[task1], 1) op11.Revision = rev2 - c.Assert(opm[task1][source1][upSchema][upTable], check.DeepEquals, op11) - c.Assert(opm[task2], check.HasLen, 1) + require.Equal(t, op11, opm[task1][source1][upSchema][upTable]) + require.Len(t, opm[task2], 1) op21.Revision = rev3 - c.Assert(opm[task2][source1][upSchema][upTable], check.DeepEquals, op21) + require.Equal(t, op21, opm[task2][source1][upSchema][upTable]) // put for `skipDone` with `done` in etcd, the operations should not be skipped. // case: kv's "the `done` field is not `true`". rev5, succ, err := PutOperation(etcdTestCli, true, op11, 0) - c.Assert(err, check.IsNil) - c.Assert(succ, check.IsTrue) - c.Assert(rev5, check.Greater, rev4) + require.NoError(t, err) + require.True(t, succ) + require.Greater(t, rev5, rev4) // delete op11. deleteOp := deleteOperationOp(op11) _, err = etcdTestCli.Txn(context.Background()).Then(deleteOp).Commit() - c.Assert(err, check.IsNil) + require.NoError(t, err) // get again, op11 should be deleted. opm, _, err = GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(opm[task1], check.HasLen, 0) + require.NoError(t, err) + require.Len(t, opm[task1], 0) // put for `skipDone` with `done` in etcd, the operations should not be skipped. // case: kv "not exist". rev6, succ, err := PutOperation(etcdTestCli, true, op11, 0) - c.Assert(err, check.IsNil) - c.Assert(succ, check.IsTrue) + require.NoError(t, err) + require.True(t, succ) // get again, op11 should be putted. opm, _, err = GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(opm[task1], check.HasLen, 1) + require.NoError(t, err) + require.Len(t, opm[task1], 1) op11.Revision = rev6 - c.Assert(opm[task1][source1][upSchema][upTable], check.DeepEquals, op11) + require.Equal(t, op11, opm[task1][source1][upSchema][upTable]) // update op11 to `done`. op11c := op11 op11c.Done = true rev7, succ, err := PutOperation(etcdTestCli, true, op11c, 0) - c.Assert(err, check.IsNil) - c.Assert(succ, check.IsTrue) - c.Assert(rev7, check.Greater, rev6) + require.NoError(t, err) + require.True(t, succ) + require.Greater(t, rev7, rev6) // put for `skipDone` with `done` in etcd, the operations should not be skipped. // case: operation modRevision < info's modRevision rev8, succ, err := PutOperation(etcdTestCli, true, op11c, rev7+10) - c.Assert(err, check.IsNil) - c.Assert(succ, check.IsTrue) - c.Assert(rev8, check.Greater, rev7) + require.NoError(t, err) + require.True(t, succ) + require.Greater(t, rev8, rev7) // put for `skipDone` with `done` in etcd, the operations should be skipped. // case: kv's ("exist" and "the `done` field is `true`"). rev9, succ, err := PutOperation(etcdTestCli, true, op11, rev6) - c.Assert(err, check.IsNil) - c.Assert(succ, check.IsFalse) - c.Assert(rev9, check.Equals, rev8) + require.NoError(t, err) + require.False(t, succ) + require.Equal(t, rev8, rev9) } diff --git a/dm/pkg/shardddl/optimism/ops_test.go b/dm/pkg/shardddl/optimism/ops_test.go index 1673d7ceb8..a6ec4f5632 100644 --- a/dm/pkg/shardddl/optimism/ops_test.go +++ b/dm/pkg/shardddl/optimism/ops_test.go @@ -14,11 +14,13 @@ package optimism import ( - "github.com/pingcap/check" + "testing" + + "github.com/stretchr/testify/require" ) -func (t *testForEtcd) TestDeleteInfosOperationsSchema(c *check.C) { - defer clearTestInfoOperation(c) +func TestDeleteInfosOperationsSchema(t *testing.T) { + defer clearTestInfoOperation(t) var ( task = "test" @@ -34,53 +36,53 @@ func (t *testForEtcd) TestDeleteInfosOperationsSchema(c *check.C) { // put info. rev, err := PutInfo(etcdTestCli, info) - c.Assert(err, check.IsNil) + require.NoError(t, err) ifm, _, err := GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(ifm, check.HasLen, 1) + require.NoError(t, err) + require.Len(t, ifm, 1) infoWithVer := info infoWithVer.Version = 1 infoWithVer.Revision = rev - c.Assert(ifm[task][source][upSchema][upTable], check.DeepEquals, infoWithVer) + require.Equal(t, infoWithVer, ifm[task][source][upSchema][upTable]) // put operation. rev, _, err = PutOperation(etcdTestCli, false, op, 0) - c.Assert(err, check.IsNil) + require.NoError(t, err) opm, _, err := GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(opm, check.HasLen, 1) + require.NoError(t, err) + require.Len(t, opm, 1) op.Revision = rev - c.Assert(opm[task][source][upSchema][upTable], check.DeepEquals, op) + require.Equal(t, op, opm[task][source][upSchema][upTable]) // DELETE info and operation with version 0 _, deleted, err := DeleteInfosOperationsColumns(etcdTestCli, []Info{info}, []Operation{op}, genDDLLockID(info)) - c.Assert(err, check.IsNil) - c.Assert(deleted, check.IsFalse) + require.NoError(t, err) + require.False(t, deleted) // data still exist ifm, _, err = GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(ifm, check.HasLen, 1) + require.NoError(t, err) + require.Len(t, ifm, 1) opm, _, err = GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(opm, check.HasLen, 1) + require.NoError(t, err) + require.Len(t, opm, 1) // DELETE info and operation with version 1 _, deleted, err = DeleteInfosOperationsColumns(etcdTestCli, []Info{infoWithVer}, []Operation{op}, genDDLLockID(infoWithVer)) - c.Assert(err, check.IsNil) - c.Assert(deleted, check.IsTrue) + require.NoError(t, err) + require.True(t, deleted) // verify no info & operation exist. ifm, _, err = GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(ifm, check.HasLen, 0) + require.NoError(t, err) + require.Len(t, ifm, 0) opm, _, err = GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(opm, check.HasLen, 0) + require.NoError(t, err) + require.Len(t, opm, 0) } -func (t *testForEtcd) TestSourceTablesInfo(c *check.C) { - defer clearTestInfoOperation(c) +func TestSourceTablesInfo(t *testing.T) { + defer clearTestInfoOperation(t) var ( task = "task" @@ -98,25 +100,25 @@ func (t *testForEtcd) TestSourceTablesInfo(c *check.C) { // put source tables rev1, err := PutSourceTables(etcdTestCli, st1) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) + require.NoError(t, err) + require.Greater(t, rev1, int64(0)) stm, rev2, err := GetAllSourceTables(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Equals, rev1) - c.Assert(stm, check.HasLen, 1) - c.Assert(stm[task], check.HasLen, 1) - c.Assert(stm[task][source], check.DeepEquals, st1) + require.NoError(t, err) + require.Equal(t, rev1, rev2) + require.Len(t, stm, 1) + require.Len(t, stm[task], 1) + require.Equal(t, st1, stm[task][source]) // put/update source tables rev4, err := PutSourceTables(etcdTestCli, st2) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Greater, rev1) + require.NoError(t, err) + require.Greater(t, rev4, rev1) stm, rev5, err := GetAllSourceTables(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev5, check.Equals, rev4) - c.Assert(stm, check.HasLen, 1) - c.Assert(stm[task], check.HasLen, 1) - c.Assert(stm[task][source], check.DeepEquals, st2) + require.NoError(t, err) + require.Equal(t, rev4, rev5) + require.Len(t, stm, 1) + require.Len(t, stm[task], 1) + require.Equal(t, st2, stm[task][source]) } diff --git a/dm/pkg/shardddl/optimism/table_test.go b/dm/pkg/shardddl/optimism/table_test.go index 812f9438e1..3ff6d49f04 100644 --- a/dm/pkg/shardddl/optimism/table_test.go +++ b/dm/pkg/shardddl/optimism/table_test.go @@ -18,24 +18,23 @@ import ( "testing" "time" - "github.com/pingcap/check" "github.com/stretchr/testify/require" ) -func (t *testForEtcd) TestSourceTablesJSON(c *check.C) { +func TestSourceTablesJSON(t *testing.T) { st1 := NewSourceTables("test", "mysql-replica-1") st1.AddTable("db1", "tbl1", "db", "tbl") j, err := st1.toJSON() - c.Assert(err, check.IsNil) - c.Assert(j, check.Equals, `{"task":"test","source":"mysql-replica-1","tables":{"db":{"tbl":{"db1":{"tbl1":{}}}}}}`) - c.Assert(j, check.Equals, st1.String()) + require.NoError(t, err) + require.Equal(t, `{"task":"test","source":"mysql-replica-1","tables":{"db":{"tbl":{"db1":{"tbl1":{}}}}}}`, j) + require.Equal(t, st1.String(), j) st2, err := sourceTablesFromJSON(j) - c.Assert(err, check.IsNil) - c.Assert(st2, check.DeepEquals, st1) + require.NoError(t, err) + require.Equal(t, st1, st2) } -func (t *testForEtcd) TestSourceTablesAddRemove(c *check.C) { +func TestSourceTablesAddRemove(t *testing.T) { var ( task = "task" source = "mysql-replica-1" @@ -46,39 +45,37 @@ func (t *testForEtcd) TestSourceTablesAddRemove(c *check.C) { ) // no target table exist. - c.Assert(st.TargetTable(downSchema, downTable1).IsEmpty(), check.IsTrue) - c.Assert(st.TargetTable(downSchema, downTable2).IsEmpty(), check.IsTrue) + require.True(t, st.TargetTable(downSchema, downTable1).IsEmpty()) + require.True(t, st.TargetTable(downSchema, downTable2).IsEmpty()) // add a table for downTable1. - c.Assert(st.AddTable("foo1", "bar1", downSchema, downTable1), check.IsTrue) - c.Assert(st.AddTable("foo1", "bar1", downSchema, downTable1), check.IsFalse) - c.Assert(st.TargetTable(downSchema, downTable1), check.DeepEquals, - newTargetTable(task, source, downSchema, downTable1, map[string]map[string]struct{}{ - "foo1": {"bar1": struct{}{}}, - })) - c.Assert(st.TargetTable(downSchema, downTable2).IsEmpty(), check.IsTrue) + require.True(t, st.AddTable("foo1", "bar1", downSchema, downTable1)) + require.False(t, st.AddTable("foo1", "bar1", downSchema, downTable1)) + require.Equal(t, newTargetTable(task, source, downSchema, downTable1, map[string]map[string]struct{}{ + "foo1": {"bar1": struct{}{}}, + }), st.TargetTable(downSchema, downTable1)) + require.True(t, st.TargetTable(downSchema, downTable2).IsEmpty()) // add a table for downTable2. - c.Assert(st.AddTable("foo2", "bar2", downSchema, downTable2), check.IsTrue) - c.Assert(st.AddTable("foo2", "bar2", downSchema, downTable2), check.IsFalse) - c.Assert(st.TargetTable(downSchema, downTable2), check.DeepEquals, - newTargetTable(task, source, downSchema, downTable2, map[string]map[string]struct{}{ - "foo2": {"bar2": struct{}{}}, - })) + require.True(t, st.AddTable("foo2", "bar2", downSchema, downTable2)) + require.False(t, st.AddTable("foo2", "bar2", downSchema, downTable2)) + require.Equal(t, newTargetTable(task, source, downSchema, downTable2, map[string]map[string]struct{}{ + "foo2": {"bar2": struct{}{}}, + }), st.TargetTable(downSchema, downTable2)) // remove a table for downTable1. - c.Assert(st.RemoveTable("foo1", "bar1", downSchema, downTable1), check.IsTrue) - c.Assert(st.RemoveTable("foo1", "bar1", downSchema, downTable1), check.IsFalse) - c.Assert(st.TargetTable(downSchema, downTable1).IsEmpty(), check.IsTrue) + require.True(t, st.RemoveTable("foo1", "bar1", downSchema, downTable1)) + require.False(t, st.RemoveTable("foo1", "bar1", downSchema, downTable1)) + require.True(t, st.TargetTable(downSchema, downTable1).IsEmpty()) // remove a table for downTable2. - c.Assert(st.RemoveTable("foo2", "bar2", downSchema, downTable2), check.IsTrue) - c.Assert(st.RemoveTable("foo2", "bar2", downSchema, downTable2), check.IsFalse) - c.Assert(st.TargetTable(downSchema, downTable2).IsEmpty(), check.IsTrue) + require.True(t, st.RemoveTable("foo2", "bar2", downSchema, downTable2)) + require.False(t, st.RemoveTable("foo2", "bar2", downSchema, downTable2)) + require.True(t, st.TargetTable(downSchema, downTable2).IsEmpty()) } -func (t *testForEtcd) TestSourceTablesEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func TestSourceTablesEtcd(t *testing.T) { + defer clearTestInfoOperation(t) var ( watchTimeout = 2 * time.Second @@ -98,19 +95,19 @@ func (t *testForEtcd) TestSourceTablesEtcd(c *check.C) { // put two SourceTables. rev1, err := PutSourceTables(etcdTestCli, st1) - c.Assert(err, check.IsNil) + require.NoError(t, err) rev2, err := PutSourceTables(etcdTestCli, st2) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + require.NoError(t, err) + require.Greater(t, rev2, rev1) // get with two SourceTables. stm, rev3, err := GetAllSourceTables(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) - c.Assert(stm, check.HasLen, 1) - c.Assert(stm[task], check.HasLen, 2) - c.Assert(stm[task][source1], check.DeepEquals, st1) - c.Assert(stm[task][source2], check.DeepEquals, st2) + require.NoError(t, err) + require.Equal(t, rev2, rev3) + require.Len(t, stm, 1) + require.Len(t, stm[task], 2) + require.Equal(t, st1, stm[task][source1]) + require.Equal(t, st2, stm[task][source2]) // watch with an older revision for all SourceTables. wch := make(chan SourceTables, 10) @@ -122,22 +119,22 @@ func (t *testForEtcd) TestSourceTablesEtcd(c *check.C) { close(ech) // get two source tables. - c.Assert(len(wch), check.Equals, 2) - c.Assert(<-wch, check.DeepEquals, st1) - c.Assert(<-wch, check.DeepEquals, st2) - c.Assert(len(ech), check.Equals, 0) + require.Equal(t, 2, len(wch)) + require.Equal(t, st1, <-wch) + require.Equal(t, st2, <-wch) + require.Equal(t, 0, len(ech)) // delete tow sources tables. _, err = DeleteSourceTables(etcdTestCli, st1) - c.Assert(err, check.IsNil) + require.NoError(t, err) rev4, err := DeleteSourceTables(etcdTestCli, st2) - c.Assert(err, check.IsNil) + require.NoError(t, err) // get without SourceTables. stm, rev5, err := GetAllSourceTables(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev5, check.Equals, rev4) - c.Assert(stm, check.HasLen, 0) + require.NoError(t, err) + require.Equal(t, rev4, rev5) + require.Len(t, stm, 0) // watch the deletion for SourceTables. wch = make(chan SourceTables, 10) @@ -147,12 +144,12 @@ func (t *testForEtcd) TestSourceTablesEtcd(c *check.C) { cancel() close(wch) close(ech) - c.Assert(len(wch), check.Equals, 1) + require.Equal(t, 1, len(wch)) std := <-wch - c.Assert(std.IsDeleted, check.IsTrue) - c.Assert(std.Task, check.Equals, st2.Task) - c.Assert(std.Source, check.Equals, st2.Source) - c.Assert(len(ech), check.Equals, 0) + require.True(t, std.IsDeleted) + require.Equal(t, st2.Task, std.Task) + require.Equal(t, st2.Source, std.Source) + require.Equal(t, 0, len(ech)) } func TestToRouteTable(t *testing.T) { diff --git a/dm/pkg/shardddl/pessimism/info_test.go b/dm/pkg/shardddl/pessimism/info_test.go index 2fb67cd803..406e7cde48 100644 --- a/dm/pkg/shardddl/pessimism/info_test.go +++ b/dm/pkg/shardddl/pessimism/info_test.go @@ -20,10 +20,11 @@ import ( "testing" "time" - "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/util/dbutil" "github.com/pingcap/tiflow/dm/common" "github.com/pingcap/tiflow/dm/pkg/utils" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" clientv3 "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/tests/v3/integration" ) @@ -37,39 +38,39 @@ func TestInfo(t *testing.T) { etcdTestCli = mockCluster.RandClient() - check.TestingT(t) + suite.Run(t, new(testForEtcd)) } // clear keys in etcd test cluster. -func clearTestInfoOperation(c *check.C) { +func clearTestInfoOperation(t require.TestingT) { clearInfo := clientv3.OpDelete(common.ShardDDLPessimismInfoKeyAdapter.Path(), clientv3.WithPrefix()) clearOp := clientv3.OpDelete(common.ShardDDLPessimismOperationKeyAdapter.Path(), clientv3.WithPrefix()) _, err := etcdTestCli.Txn(context.Background()).Then(clearInfo, clearOp).Commit() - c.Assert(err, check.IsNil) + require.NoError(t, err) } -type testForEtcd struct{} - -var _ = check.Suite(&testForEtcd{}) +type testForEtcd struct { + suite.Suite +} -func (t *testForEtcd) TestInfoJSON(c *check.C) { +func (t *testForEtcd) TestInfoJSON() { i1 := NewInfo("test", "mysql-replica-1", "foo", "bar", []string{ "ALTER TABLE bar ADD COLUMN c1 INT", "ALTER TABLE bar ADD COLUMN c2 INT", }) j, err := i1.toJSON() - c.Assert(err, check.IsNil) - c.Assert(j, check.Equals, `{"task":"test","source":"mysql-replica-1","schema":"foo","table":"bar","ddls":["ALTER TABLE bar ADD COLUMN c1 INT","ALTER TABLE bar ADD COLUMN c2 INT"]}`) - c.Assert(j, check.Equals, i1.String()) + t.Require().NoError(err) + t.Require().Equal(`{"task":"test","source":"mysql-replica-1","schema":"foo","table":"bar","ddls":["ALTER TABLE bar ADD COLUMN c1 INT","ALTER TABLE bar ADD COLUMN c2 INT"]}`, j) + t.Require().Equal(i1.String(), j) i2, err := infoFromJSON(j) - c.Assert(err, check.IsNil) - c.Assert(i2, check.DeepEquals, i1) + t.Require().NoError(err) + t.Require().Equal(i1, i2) } -func (t *testForEtcd) TestInfoEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func (t *testForEtcd) TestInfoEtcd() { + defer clearTestInfoOperation(t.T()) var ( source1 = "mysql-replica-1" @@ -89,30 +90,30 @@ func (t *testForEtcd) TestInfoEtcd(c *check.C) { // put the same key twice. rev1, err := PutInfo(etcdTestCli, i11) - c.Assert(err, check.IsNil) + t.Require().NoError(err) rev2, err := PutInfo(etcdTestCli, i11) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + t.Require().NoError(err) + t.Require().Greater(rev2, rev1) // get with only 1 info. ifm, rev3, err := GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) - c.Assert(ifm, check.HasLen, 1) - c.Assert(ifm, check.HasKey, task1) - c.Assert(ifm[task1], check.HasLen, 1) - c.Assert(ifm[task1][source1], check.DeepEquals, i11) + t.Require().NoError(err) + t.Require().Equal(rev2, rev3) + t.Require().Len(ifm, 1) + t.Require().Contains(ifm, task1) + t.Require().Len(ifm[task1], 1) + t.Require().Equal(i11, ifm[task1][source1]) // put another key and get again with 2 info. rev4, err := PutInfo(etcdTestCli, i12) - c.Assert(err, check.IsNil) + t.Require().NoError(err) ifm, _, err = GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(ifm, check.HasLen, 1) - c.Assert(ifm, check.HasKey, task1) - c.Assert(ifm[task1], check.HasLen, 2) - c.Assert(ifm[task1][source1], check.DeepEquals, i11) - c.Assert(ifm[task1][source2], check.DeepEquals, i12) + t.Require().NoError(err) + t.Require().Len(ifm, 1) + t.Require().Contains(ifm, task1) + t.Require().Len(ifm[task1], 2) + t.Require().Equal(i11, ifm[task1][source1]) + t.Require().Equal(i12, ifm[task1][source2]) // start the watcher. wch := make(chan Info, 10) @@ -129,7 +130,7 @@ func (t *testForEtcd) TestInfoEtcd(c *check.C) { // put another key for a different task. _, err = PutInfo(etcdTestCli, i21) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // wait response of WatchInfoPut, increase waiting time when resource shortage utils.WaitSomething(10, 500*time.Millisecond, func() bool { return len(wch) != 0 @@ -138,29 +139,29 @@ func (t *testForEtcd) TestInfoEtcd(c *check.C) { wg.Wait() // watch should only get i21. - c.Assert(len(wch), check.Equals, 1) - c.Assert(len(ech), check.Equals, 0) - c.Assert(<-wch, check.DeepEquals, i21) + t.Require().Equal(1, len(wch)) + t.Require().Equal(0, len(ech)) + t.Require().Equal(i21, <-wch) // delete i12. deleteOp := deleteInfoOp(i12) _, err = etcdTestCli.Txn(context.Background()).Then(deleteOp).Commit() - c.Assert(err, check.IsNil) + t.Require().NoError(err) // get again. ifm, _, err = GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(ifm, check.HasLen, 2) - c.Assert(ifm, check.HasKey, task1) - c.Assert(ifm, check.HasKey, task2) - c.Assert(ifm[task1], check.HasLen, 1) - c.Assert(ifm[task1][source1], check.DeepEquals, i11) - c.Assert(ifm[task2], check.HasLen, 1) - c.Assert(ifm[task2][source1], check.DeepEquals, i21) + t.Require().NoError(err) + t.Require().Len(ifm, 2) + t.Require().Contains(ifm, task1) + t.Require().Contains(ifm, task2) + t.Require().Len(ifm[task1], 1) + t.Require().Equal(i11, ifm[task1][source1]) + t.Require().Len(ifm[task2], 1) + t.Require().Equal(i21, ifm[task2][source1]) } -func (t *testForEtcd) TestPutInfoIfOpNotDone(c *check.C) { - defer clearTestInfoOperation(c) +func (t *testForEtcd) TestPutInfoIfOpNotDone() { + defer clearTestInfoOperation(t.T()) var ( source = "mysql-replica-1" @@ -175,39 +176,39 @@ func (t *testForEtcd) TestPutInfoIfOpNotDone(c *check.C) { // put info success because no operation exist. rev1, putted, err := PutInfoIfOpNotDone(etcdTestCli, info) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) - c.Assert(putted, check.IsTrue) + t.Require().NoError(err) + t.Require().Greater(rev1, int64(0)) + t.Require().True(putted) // put a non-done operation. rev2, putted, err := PutOperations(etcdTestCli, false, op) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) - c.Assert(putted, check.IsTrue) + t.Require().NoError(err) + t.Require().Greater(rev2, rev1) + t.Require().True(putted) // still can put info. rev3, putted, err := PutInfoIfOpNotDone(etcdTestCli, info) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Greater, rev2) - c.Assert(putted, check.IsTrue) + t.Require().NoError(err) + t.Require().Greater(rev3, rev2) + t.Require().True(putted) // change op to `done` and put it. op.Done = true rev4, putted, err := PutOperations(etcdTestCli, false, op) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Greater, rev3) - c.Assert(putted, check.IsTrue) + t.Require().NoError(err) + t.Require().Greater(rev4, rev3) + t.Require().True(putted) // can't put info anymore. rev5, putted, err := PutInfoIfOpNotDone(etcdTestCli, info) - c.Assert(err, check.IsNil) - c.Assert(rev5, check.Equals, rev4) - c.Assert(putted, check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(rev4, rev5) + t.Require().False(putted) // try put anther info, but still can't put it. info.DDLs = []string{"ALTER TABLE bar ADD COLUMN c2 INT"} rev6, putted, err := PutInfoIfOpNotDone(etcdTestCli, info) - c.Assert(err, check.IsNil) - c.Assert(rev6, check.Equals, rev5) - c.Assert(putted, check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(rev5, rev6) + t.Require().False(putted) } diff --git a/dm/pkg/shardddl/pessimism/keeper_test.go b/dm/pkg/shardddl/pessimism/keeper_test.go index 7d54f81c50..6275e3c7d9 100644 --- a/dm/pkg/shardddl/pessimism/keeper_test.go +++ b/dm/pkg/shardddl/pessimism/keeper_test.go @@ -14,14 +14,12 @@ package pessimism import ( - "github.com/pingcap/check" -) - -type testLockKeeper struct{} + "testing" -var _ = check.Suite(&testLockKeeper{}) + "github.com/stretchr/testify/require" +) -func (t *testLockKeeper) TestLockKeeper(c *check.C) { +func TestLockKeeper(t *testing.T) { var ( lk = NewLockKeeper() schema = "foo" @@ -38,47 +36,47 @@ func (t *testLockKeeper) TestLockKeeper(c *check.C) { // lock with 2 sources. lockID1, synced, remain, err := lk.TrySync(info11, []string{source1, source2}) - c.Assert(err, check.IsNil) - c.Assert(lockID1, check.Equals, "task1-`foo`.`bar`") - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 1) + require.NoError(t, err) + require.Equal(t, "task1-`foo`.`bar`", lockID1) + require.False(t, synced) + require.Equal(t, 1, remain) lockID1, synced, remain, err = lk.TrySync(info12, []string{source1, source2}) - c.Assert(err, check.IsNil) - c.Assert(lockID1, check.Equals, "task1-`foo`.`bar`") - c.Assert(synced, check.IsTrue) - c.Assert(remain, check.Equals, 0) + require.NoError(t, err) + require.Equal(t, "task1-`foo`.`bar`", lockID1) + require.True(t, synced) + require.Equal(t, 0, remain) // lock with only 1 source. lockID2, synced, remain, err := lk.TrySync(info21, []string{source1}) - c.Assert(err, check.IsNil) - c.Assert(lockID2, check.Equals, "task2-`foo`.`bar`") - c.Assert(synced, check.IsTrue) - c.Assert(remain, check.Equals, 0) + require.NoError(t, err) + require.Equal(t, "task2-`foo`.`bar`", lockID2) + require.True(t, synced) + require.Equal(t, 0, remain) // find lock. lock1 := lk.FindLock(lockID1) - c.Assert(lock1, check.NotNil) - c.Assert(lock1.ID, check.Equals, lockID1) + require.NotNil(t, lock1) + require.Equal(t, lockID1, lock1.ID) lock2 := lk.FindLock(lockID2) - c.Assert(lock2, check.NotNil) - c.Assert(lock2.ID, check.Equals, lockID2) + require.NotNil(t, lock2) + require.Equal(t, lockID2, lock2.ID) lockIDNotExists := "lock-not-exists" - c.Assert(lk.FindLock(lockIDNotExists), check.IsNil) + require.Nil(t, lk.FindLock(lockIDNotExists)) // all locks. locks := lk.Locks() - c.Assert(locks, check.HasLen, 2) - c.Assert(locks[lockID1], check.Equals, lock1) // compare pointer - c.Assert(locks[lockID2], check.Equals, lock2) + require.Len(t, locks, 2) + require.Equal(t, lock1, locks[lockID1]) // compare pointer + require.Equal(t, lock2, locks[lockID2]) // remove lock. - c.Assert(lk.RemoveLock(lockID1), check.IsTrue) - c.Assert(lk.RemoveLock(lockIDNotExists), check.IsFalse) - c.Assert(lk.Locks(), check.HasLen, 1) + require.True(t, lk.RemoveLock(lockID1)) + require.False(t, lk.RemoveLock(lockIDNotExists)) + require.Len(t, lk.Locks(), 1) // clear locks. lk.Clear() // no locks exist. - c.Assert(lk.Locks(), check.HasLen, 0) + require.Len(t, lk.Locks(), 0) } diff --git a/dm/pkg/shardddl/pessimism/lock_test.go b/dm/pkg/shardddl/pessimism/lock_test.go index 87026cdf62..6079dbd9bb 100644 --- a/dm/pkg/shardddl/pessimism/lock_test.go +++ b/dm/pkg/shardddl/pessimism/lock_test.go @@ -14,15 +14,13 @@ package pessimism import ( - "github.com/pingcap/check" + "testing" + "github.com/pingcap/tiflow/dm/pkg/terror" + "github.com/stretchr/testify/require" ) -type testLock struct{} - -var _ = check.Suite(&testLock{}) - -func (t *testLock) TestLock(c *check.C) { +func TestLock(t *testing.T) { var ( ID = "test-`foo`.`bar`" task = "test" @@ -40,101 +38,101 @@ func (t *testLock) TestLock(c *check.C) { // DDLs mismatch. synced, remain, err := l1.TrySync(source1, DDLs[1:], []string{source1}) - c.Assert(terror.ErrMasterShardingDDLDiff.Equal(err), check.IsTrue) - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 1) - c.Assert(l1.Ready(), check.DeepEquals, map[string]bool{source1: false}) + require.True(t, terror.ErrMasterShardingDDLDiff.Equal(err)) + require.False(t, synced) + require.Equal(t, 1, remain) + require.Equal(t, map[string]bool{source1: false}, l1.Ready()) synced, _ = l1.IsSynced() - c.Assert(synced, check.IsFalse) - c.Assert(l1.IsDone(source1), check.IsFalse) - c.Assert(l1.IsResolved(), check.IsFalse) + require.False(t, synced) + require.False(t, l1.IsDone(source1)) + require.False(t, l1.IsResolved()) // synced. synced, remain, err = l1.TrySync(source1, DDLs, []string{source1}) - c.Assert(err, check.IsNil) - c.Assert(synced, check.IsTrue) - c.Assert(remain, check.Equals, 0) - c.Assert(l1.Ready(), check.DeepEquals, map[string]bool{source1: true}) + require.NoError(t, err) + require.True(t, synced) + require.Equal(t, 0, remain) + require.Equal(t, map[string]bool{source1: true}, l1.Ready()) synced, _ = l1.IsSynced() - c.Assert(synced, check.IsTrue) - c.Assert(l1.IsDone(source1), check.IsFalse) - c.Assert(l1.IsResolved(), check.IsFalse) + require.True(t, synced) + require.False(t, l1.IsDone(source1)) + require.False(t, l1.IsResolved()) // mark done. l1.MarkDone(source1) - c.Assert(l1.IsDone(source1), check.IsTrue) - c.Assert(l1.IsResolved(), check.IsTrue) + require.True(t, l1.IsDone(source1)) + require.True(t, l1.IsResolved()) // create the lock with 2 sources. l2 := NewLock(ID, task, source1, DDLs, []string{source1, source2}) // join a new source. synced, remain, err = l2.TrySync(source1, DDLs, []string{source2, source3}) - c.Assert(err, check.IsNil) - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 2) - c.Assert(l2.Ready(), check.DeepEquals, map[string]bool{ + require.NoError(t, err) + require.False(t, synced) + require.Equal(t, 2, remain) + require.Equal(t, map[string]bool{ source1: true, source2: false, source3: false, - }) + }, l2.Ready()) // sync other sources. synced, remain, err = l2.TrySync(source2, DDLs, []string{}) - c.Assert(err, check.IsNil) - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 1) - c.Assert(l2.Ready(), check.DeepEquals, map[string]bool{ + require.NoError(t, err) + require.False(t, synced) + require.Equal(t, 1, remain) + require.Equal(t, map[string]bool{ source1: true, source2: true, source3: false, - }) + }, l2.Ready()) synced, remain, err = l2.TrySync(source3, DDLs, nil) - c.Assert(err, check.IsNil) - c.Assert(synced, check.IsTrue) - c.Assert(remain, check.Equals, 0) - c.Assert(l2.Ready(), check.DeepEquals, map[string]bool{ + require.NoError(t, err) + require.True(t, synced) + require.Equal(t, 0, remain) + require.Equal(t, map[string]bool{ source1: true, source2: true, source3: true, - }) + }, l2.Ready()) // done none. - c.Assert(l2.IsDone(source1), check.IsFalse) - c.Assert(l2.IsDone(source2), check.IsFalse) - c.Assert(l2.IsDone(source3), check.IsFalse) - c.Assert(l2.IsResolved(), check.IsFalse) + require.False(t, l2.IsDone(source1)) + require.False(t, l2.IsDone(source2)) + require.False(t, l2.IsDone(source3)) + require.False(t, l2.IsResolved()) // done some. l2.MarkDone(source1) l2.MarkDone(source2) - c.Assert(l2.IsDone(source1), check.IsTrue) - c.Assert(l2.IsDone(source2), check.IsTrue) - c.Assert(l2.IsDone(source3), check.IsFalse) - c.Assert(l2.IsResolved(), check.IsFalse) + require.True(t, l2.IsDone(source1)) + require.True(t, l2.IsDone(source2)) + require.False(t, l2.IsDone(source3)) + require.False(t, l2.IsResolved()) // done all. l2.MarkDone(source3) - c.Assert(l2.IsDone(source3), check.IsTrue) - c.Assert(l2.IsResolved(), check.IsTrue) + require.True(t, l2.IsDone(source3)) + require.True(t, l2.IsResolved()) // mark on not existing source has no effect. l2.MarkDone("not-exist-source") - c.Assert(l2.IsResolved(), check.IsTrue) + require.True(t, l2.IsResolved()) // create the lock with 2 sources. l3 := NewLock(ID, task, source1, DDLs, []string{source1, source2}) l3.ForceSynced() synced, remain = l3.IsSynced() - c.Assert(synced, check.IsTrue) - c.Assert(remain, check.Equals, 0) + require.True(t, synced) + require.Equal(t, 0, remain) // revert the synced stage. l3.RevertSynced([]string{source2}) synced, remain = l3.IsSynced() - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 1) + require.False(t, synced) + require.Equal(t, 1, remain) ready := l3.Ready() - c.Assert(ready[source1], check.IsTrue) - c.Assert(ready[source2], check.IsFalse) + require.True(t, ready[source1]) + require.False(t, ready[source2]) } diff --git a/dm/pkg/shardddl/pessimism/operation_test.go b/dm/pkg/shardddl/pessimism/operation_test.go index 80a012441d..3b97b63452 100644 --- a/dm/pkg/shardddl/pessimism/operation_test.go +++ b/dm/pkg/shardddl/pessimism/operation_test.go @@ -18,24 +18,23 @@ import ( "fmt" "time" - "github.com/pingcap/check" "go.etcd.io/etcd/api/v3/mvccpb" clientv3 "go.etcd.io/etcd/client/v3" ) -func (t *testForEtcd) TestOperationJSON(c *check.C) { +func (t *testForEtcd) TestOperationJSON() { o1 := NewOperation("test-ID", "test", "mysql-replica-1", []string{ "ALTER TABLE bar ADD COLUMN c1 INT", }, true, false) j, err := o1.toJSON() - c.Assert(err, check.IsNil) - c.Assert(j, check.Equals, `{"id":"test-ID","task":"test","source":"mysql-replica-1","ddls":["ALTER TABLE bar ADD COLUMN c1 INT"],"exec":true,"done":false}`) - c.Assert(j, check.Equals, o1.String()) + t.Require().NoError(err) + t.Require().Equal(`{"id":"test-ID","task":"test","source":"mysql-replica-1","ddls":["ALTER TABLE bar ADD COLUMN c1 INT"],"exec":true,"done":false}`, j) + t.Require().Equal(o1.String(), j) o2, err := operationFromJSON(j) - c.Assert(err, check.IsNil) - c.Assert(o2, check.DeepEquals, o1) + t.Require().NoError(err) + t.Require().Equal(o1, o2) } func watchExactOperations( @@ -74,8 +73,8 @@ func watchExactOperations( return ops, nil } -func (t *testForEtcd) TestOperationEtcd(c *check.C) { - defer clearTestInfoOperation(c) +func (t *testForEtcd) TestOperationEtcd() { + defer clearTestInfoOperation(t.T()) var ( task1 = "test1" @@ -94,113 +93,113 @@ func (t *testForEtcd) TestOperationEtcd(c *check.C) { // put the same keys twice. rev1, succ, err := PutOperations(etcdTestCli, false, op11, op12) - c.Assert(err, check.IsNil) - c.Assert(succ, check.IsTrue) + t.Require().NoError(err) + t.Require().True(succ) rev2, succ, err := PutOperations(etcdTestCli, false, op11, op12) - c.Assert(err, check.IsNil) - c.Assert(succ, check.IsTrue) - c.Assert(rev2, check.Greater, rev1) + t.Require().NoError(err) + t.Require().True(succ) + t.Require().Greater(rev2, rev1) // start the watcher with the same revision as the last PUT for the specified task and source. ops, err := watchExactOperations(context.Background(), etcdTestCli, mvccpb.PUT, task1, source1, rev2, 1) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // watch should only get op11. - c.Assert(ops[0], check.DeepEquals, op11) + t.Require().Equal(op11, ops[0]) // put for another task. rev3, succ, err := PutOperations(etcdTestCli, false, op21) - c.Assert(err, check.IsNil) - c.Assert(succ, check.IsTrue) + t.Require().NoError(err) + t.Require().True(succ) // start the watch with an older revision for all tasks and sources. ops, err = watchExactOperations(context.Background(), etcdTestCli, mvccpb.PUT, "", "", rev2, 3) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // watch should get 3 operations. - c.Assert(ops[0], check.DeepEquals, op11) - c.Assert(ops[1], check.DeepEquals, op12) - c.Assert(ops[2], check.DeepEquals, op21) + t.Require().Equal(op11, ops[0]) + t.Require().Equal(op12, ops[1]) + t.Require().Equal(op21, ops[2]) // get all operations. opm, rev4, err := GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Equals, rev3) - c.Assert(opm, check.HasLen, 2) - c.Assert(opm, check.HasKey, task1) - c.Assert(opm, check.HasKey, task2) - c.Assert(opm[task1], check.HasLen, 2) - c.Assert(opm[task1][source1], check.DeepEquals, op11) - c.Assert(opm[task1][source2], check.DeepEquals, op12) - c.Assert(opm[task2], check.HasLen, 1) - c.Assert(opm[task2][source1], check.DeepEquals, op21) + t.Require().NoError(err) + t.Require().Equal(rev3, rev4) + t.Require().Len(opm, 2) + t.Require().Contains(opm, task1) + t.Require().Contains(opm, task2) + t.Require().Len(opm[task1], 2) + t.Require().Equal(op11, opm[task1][source1]) + t.Require().Equal(op12, opm[task1][source2]) + t.Require().Len(opm[task2], 1) + t.Require().Equal(op21, opm[task2][source1]) // put for `skipDone` with `done` in etcd, the operations should not be skipped. // case: all of kvs "the `done` field is not `true`". rev5, succ, err := PutOperations(etcdTestCli, true, op11, op12) - c.Assert(err, check.IsNil) - c.Assert(succ, check.IsTrue) - c.Assert(rev5, check.Greater, rev4) + t.Require().NoError(err) + t.Require().True(succ) + t.Require().Greater(rev5, rev4) // delete op11. rev6, err := DeleteOperations(etcdTestCli, op11) - c.Assert(err, check.IsNil) - c.Assert(rev6, check.Greater, rev5) + t.Require().NoError(err) + t.Require().Greater(rev6, rev5) // start watch with an older revision for the deleted op11. ops, err = watchExactOperations(context.Background(), etcdTestCli, mvccpb.DELETE, op11.Task, op11.Source, rev5, 1) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // watch should got the previous deleted operation. op11d := ops[0] - c.Assert(op11d.IsDeleted, check.IsTrue) + t.Require().True(op11d.IsDeleted) op11d.IsDeleted = false // reset to false - c.Assert(op11d, check.DeepEquals, op11) + t.Require().Equal(op11, op11d) // get again, op11 should be deleted. opm, _, err = GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(opm[task1], check.HasLen, 1) - c.Assert(opm[task1][source2], check.DeepEquals, op12) + t.Require().NoError(err) + t.Require().Len(opm[task1], 1) + t.Require().Equal(op12, opm[task1][source2]) // put for `skipDone` with `done` in etcd, the operations should not be skipped. // case: all of kvs "not exist". rev7, succ, err := PutOperations(etcdTestCli, true, op11, op13) - c.Assert(err, check.IsNil) - c.Assert(succ, check.IsTrue) - c.Assert(rev7, check.Greater, rev6) + t.Require().NoError(err) + t.Require().True(succ) + t.Require().Greater(rev7, rev6) // get again, op11 and op13 should be putted. opm, _, err = GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(opm[task1], check.HasLen, 3) - c.Assert(opm[task1][source1], check.DeepEquals, op11) - c.Assert(opm[task1][source2], check.DeepEquals, op12) - c.Assert(opm[task1][source3], check.DeepEquals, op13) + t.Require().NoError(err) + t.Require().Len(opm[task1], 3) + t.Require().Equal(op11, opm[task1][source1]) + t.Require().Equal(op12, opm[task1][source2]) + t.Require().Equal(op13, opm[task1][source3]) // update op12 to `done`. op12c := op12 op12c.Done = true putOp, err := putOperationOp(op12c) - c.Assert(err, check.IsNil) + t.Require().NoError(err) txnResp, err := etcdTestCli.Txn(context.Background()).Then(putOp).Commit() - c.Assert(err, check.IsNil) + t.Require().NoError(err) // delete op13. rev8, err := DeleteOperations(etcdTestCli, op13) - c.Assert(err, check.IsNil) - c.Assert(rev8, check.Greater, txnResp.Header.Revision) + t.Require().NoError(err) + t.Require().Greater(rev8, txnResp.Header.Revision) // put for `skipDone` with `done` in etcd, the operations should be skipped. // case: any of kvs ("exist" and "the `done` field is `true`"). rev9, succ, err := PutOperations(etcdTestCli, true, op12, op13) - c.Assert(err, check.IsNil) - c.Assert(succ, check.IsFalse) - c.Assert(rev9, check.Equals, rev8) + t.Require().NoError(err) + t.Require().False(succ) + t.Require().Equal(rev8, rev9) // get again, op13 not putted. opm, _, err = GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(opm[task1], check.HasLen, 2) - c.Assert(opm[task1][source1], check.DeepEquals, op11) - c.Assert(opm[task1][source2], check.DeepEquals, op12c) + t.Require().NoError(err) + t.Require().Len(opm[task1], 2) + t.Require().Equal(op11, opm[task1][source1]) + t.Require().Equal(op12c, opm[task1][source2]) // FIXME: the right result: // the operations should *NOT* be skipped. @@ -209,7 +208,7 @@ func (t *testForEtcd) TestOperationEtcd(c *check.C) { // - some of kvs "not exist" // after FIXED, this test case will fail and need to be updated. rev10, succ, err := PutOperations(etcdTestCli, true, op11, op13) - c.Assert(err, check.IsNil) - c.Assert(succ, check.IsFalse) - c.Assert(rev10, check.Equals, rev9) + t.Require().NoError(err) + t.Require().False(succ) + t.Require().Equal(rev9, rev10) } diff --git a/dm/pkg/shardddl/pessimism/ops_test.go b/dm/pkg/shardddl/pessimism/ops_test.go index 4d32768329..b68a9a6999 100644 --- a/dm/pkg/shardddl/pessimism/ops_test.go +++ b/dm/pkg/shardddl/pessimism/ops_test.go @@ -13,12 +13,8 @@ package pessimism -import ( - "github.com/pingcap/check" -) - -func (t *testForEtcd) TestPutOperationDeleteInfo(c *check.C) { - defer clearTestInfoOperation(c) +func (t *testForEtcd) TestPutOperationDeleteInfo() { + defer clearTestInfoOperation(t.T()) var ( task = "test" @@ -30,88 +26,88 @@ func (t *testForEtcd) TestPutOperationDeleteInfo(c *check.C) { // put info. _, err := PutInfo(etcdTestCli, info) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // verify the info exists. ifm, _, err := GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(ifm, check.HasLen, 1) - c.Assert(ifm, check.HasKey, task) - c.Assert(ifm[task][source], check.DeepEquals, info) + t.Require().NoError(err) + t.Require().Len(ifm, 1) + t.Require().Contains(ifm, task) + t.Require().Equal(info, ifm[task][source]) // verify no operations exist. opm, _, err := GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(opm, check.HasLen, 0) + t.Require().NoError(err) + t.Require().Len(opm, 0) // put operation & delete info. done, _, err := PutOperationDeleteExistInfo(etcdTestCli, op, info) - c.Assert(err, check.IsNil) - c.Assert(done, check.IsTrue) + t.Require().NoError(err) + t.Require().True(done) // verify no info exit. ifm, _, err = GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(ifm, check.HasLen, 0) + t.Require().NoError(err) + t.Require().Len(ifm, 0) // verify the operation exists. opm, _, err = GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(opm, check.HasLen, 1) - c.Assert(opm, check.HasKey, task) - c.Assert(opm[task][source], check.DeepEquals, op) + t.Require().NoError(err) + t.Require().Len(opm, 1) + t.Require().Contains(opm, task) + t.Require().Equal(op, opm[task][source]) // try to put operation & delete info again, succeed(to support reentrant). done, _, err = PutOperationDeleteExistInfo(etcdTestCli, op, info) - c.Assert(err, check.IsNil) - c.Assert(done, check.IsTrue) + t.Require().NoError(err) + t.Require().True(done) // PUT info and operation. _, err = PutInfo(etcdTestCli, info) - c.Assert(err, check.IsNil) + t.Require().NoError(err) _, _, err = PutOperations(etcdTestCli, true, op) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // verify the info exists. ifm, _, err = GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(ifm, check.HasLen, 1) - c.Assert(ifm, check.HasKey, task) - c.Assert(ifm[task][source], check.DeepEquals, info) + t.Require().NoError(err) + t.Require().Len(ifm, 1) + t.Require().Contains(ifm, task) + t.Require().Equal(info, ifm[task][source]) // verify the operation exists. opm, _, err = GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(opm, check.HasLen, 1) - c.Assert(opm, check.HasKey, task) - c.Assert(opm[task][source], check.DeepEquals, op) + t.Require().NoError(err) + t.Require().Len(opm, 1) + t.Require().Contains(opm, task) + t.Require().Equal(op, opm[task][source]) // DELETE info and operation. _, err = DeleteInfosOperations(etcdTestCli, []Info{info}, []Operation{op}) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // verify no info exit. ifm, _, err = GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(ifm, check.HasLen, 0) + t.Require().NoError(err) + t.Require().Len(ifm, 0) // verify no operations exist. opm, _, err = GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(opm, check.HasLen, 0) + t.Require().NoError(err) + t.Require().Len(opm, 0) // put a done operation into etcd and try to delete operation again. op.Done = true _, _, err = PutOperations(etcdTestCli, true, op) op.Done = false - c.Assert(err, check.IsNil) + t.Require().NoError(err) // try to put operation & delete info again, fail(operation not equal). done, _, err = PutOperationDeleteExistInfo(etcdTestCli, op, info) - c.Assert(err, check.IsNil) - c.Assert(done, check.IsFalse) + t.Require().NoError(err) + t.Require().False(done) // DELETE info and operation. _, err = DeleteInfosOperations(etcdTestCli, []Info{info}, []Operation{op}) - c.Assert(err, check.IsNil) + t.Require().NoError(err) } diff --git a/dm/pkg/upgrade/upgrade_test.go b/dm/pkg/upgrade/upgrade_test.go index 225ae9b56f..ca32f1e277 100644 --- a/dm/pkg/upgrade/upgrade_test.go +++ b/dm/pkg/upgrade/upgrade_test.go @@ -18,8 +18,9 @@ import ( "fmt" "testing" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/common" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" clientv3 "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/tests/v3/integration" ) @@ -34,51 +35,44 @@ var ( func TestUpgrade(t *testing.T) { integration.BeforeTestExternal(t) - suite.(*testForEtcd).testT = t - suiteForBigTxn.(*testForBigTxn).testT = t - - check.TestingT(t) + suite.Run(t, new(testForEtcd)) + suite.Run(t, new(testForBigTxn)) } -func clearTestData(c *check.C) { +func clearTestData(t require.TestingT) { clearVersion := clientv3.OpDelete(common.ClusterVersionKey) _, err := etcdTestCli.Txn(context.Background()).Then(clearVersion).Commit() - c.Assert(err, check.IsNil) + require.NoError(t, err) } type testForEtcd struct { - testT *testing.T + suite.Suite } type testForBigTxn struct { - testT *testing.T + suite.Suite } -var ( - suite = check.SerialSuites(&testForEtcd{}) - suiteForBigTxn = check.SerialSuites(&testForBigTxn{}) -) - -func (t *testForEtcd) SetUpSuite(c *check.C) { - mockCluster = integration.NewClusterV3(t.testT, &integration.ClusterConfig{Size: 1}) +func (t *testForEtcd) SetupSuite() { + mockCluster = integration.NewClusterV3(t.T(), &integration.ClusterConfig{Size: 1}) etcdTestCli = mockCluster.RandClient() } -func (t *testForEtcd) TearDownSuite(c *check.C) { - mockCluster.Terminate(t.testT) +func (t *testForEtcd) TearDownSuite() { + mockCluster.Terminate(t.T()) } -func (t *testForBigTxn) SetUpSuite(c *check.C) { - bigTxnCluster = integration.NewClusterV3(t.testT, &integration.ClusterConfig{Size: 1, MaxTxnOps: 2048}) +func (t *testForBigTxn) SetupSuite() { + bigTxnCluster = integration.NewClusterV3(t.T(), &integration.ClusterConfig{Size: 1, MaxTxnOps: 2048}) bigTxnTestCli = bigTxnCluster.RandClient() } -func (t *testForBigTxn) TearDownSuite(c *check.C) { - bigTxnCluster.Terminate(t.testT) +func (t *testForBigTxn) TearDownSuite() { + bigTxnCluster.Terminate(t.T()) } -func (t *testForEtcd) TestTryUpgrade(c *check.C) { - defer clearTestData(c) +func (t *testForEtcd) TestTryUpgrade() { + defer clearTestData(t.T()) // mock upgrade functions. oldUpgrades := upgrades @@ -95,26 +89,26 @@ func (t *testForEtcd) TestTryUpgrade(c *check.C) { // no previous version exist, new cluster. ver, rev1, err := GetVersion(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) - c.Assert(ver.NotSet(), check.IsTrue) + t.Require().NoError(err) + t.Require().Greater(rev1, int64(0)) + t.Require().True(ver.NotSet()) // try to upgrade, run actual upgrade functions - c.Assert(TryUpgrade(etcdTestCli, newUpgradeContext()), check.IsNil) + t.Require().NoError(TryUpgrade(etcdTestCli, newUpgradeContext())) ver, rev2, err := GetVersion(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) - c.Assert(ver, check.DeepEquals, CurrentVersion) - c.Assert(mockVerNo, check.Equals, uint64(5)) + t.Require().NoError(err) + t.Require().Greater(rev2, rev1) + t.Require().Equal(CurrentVersion, ver) + t.Require().Equal(uint64(5), mockVerNo) // try to upgrade again, do nothing because the version is the same. mockVerNo = 0 - c.Assert(TryUpgrade(etcdTestCli, newUpgradeContext()), check.IsNil) + t.Require().NoError(TryUpgrade(etcdTestCli, newUpgradeContext())) ver, rev3, err := GetVersion(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) - c.Assert(ver, check.DeepEquals, CurrentVersion) - c.Assert(mockVerNo, check.Equals, uint64(0)) + t.Require().NoError(err) + t.Require().Equal(rev2, rev3) + t.Require().Equal(CurrentVersion, ver) + t.Require().Equal(uint64(0), mockVerNo) // mock a newer current version. oldCurrentVer := CurrentVersion @@ -125,60 +119,62 @@ func (t *testForEtcd) TestTryUpgrade(c *check.C) { CurrentVersion = newerVer // try to upgrade, to a newer version, upgrade operations applied. - c.Assert(TryUpgrade(etcdTestCli, newUpgradeContext()), check.IsNil) + t.Require().NoError(TryUpgrade(etcdTestCli, newUpgradeContext())) ver, rev4, err := GetVersion(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Greater, rev3) - c.Assert(ver, check.DeepEquals, newerVer) - c.Assert(mockVerNo, check.Equals, currentInternalNo+1) + t.Require().NoError(err) + t.Require().Greater(rev4, rev3) + t.Require().Equal(newerVer, ver) + t.Require().Equal(currentInternalNo+1, mockVerNo) // try to upgrade, to an older version, do nothing. mockVerNo = 0 CurrentVersion = oldCurrentVer - c.Assert(TryUpgrade(etcdTestCli, newUpgradeContext()), check.IsNil) + t.Require().NoError(TryUpgrade(etcdTestCli, newUpgradeContext())) ver, rev5, err := GetVersion(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev5, check.Equals, rev4) - c.Assert(ver, check.DeepEquals, newerVer) // not changed. - c.Assert(mockVerNo, check.Equals, uint64(0)) + t.Require().NoError(err) + t.Require().Equal(rev4, rev5) + t.Require().Equal(newerVer, ver) // not changed. + t.Require().Equal(uint64(0), mockVerNo) } -func (t *testForEtcd) TestUpgradeToVer3(c *check.C) { +func (t *testForEtcd) TestUpgradeToVer3() { ctx := context.Background() source := "source-1" oldKey := common.UpstreamConfigKeyAdapterV1.Encode(source) oldVal := "test" _, err := etcdTestCli.Put(ctx, oldKey, oldVal) - c.Assert(err, check.IsNil) - c.Assert(upgradeToVer3(ctx, etcdTestCli), check.IsNil) + t.Require().NoError(err) + t.Require().NoError(upgradeToVer3(ctx, etcdTestCli)) newKey := common.UpstreamConfigKeyAdapter.Encode(source) resp, err := etcdTestCli.Get(ctx, newKey) - c.Assert(err, check.IsNil) - c.Assert(resp.Kvs, check.HasLen, 1) - c.Assert(string(resp.Kvs[0].Value), check.Equals, oldVal) + t.Require().NoError(err) + t.Require().Len(resp.Kvs, 1) + t.Require().Equal(oldVal, string(resp.Kvs[0].Value)) // test won't overwrite new value newVal := "test2" _, err = etcdTestCli.Put(ctx, newKey, newVal) - c.Assert(err, check.IsNil) - c.Assert(upgradeToVer3(ctx, etcdTestCli), check.IsNil) + t.Require().NoError(err) + t.Require().NoError(upgradeToVer3(ctx, etcdTestCli)) resp, err = etcdTestCli.Get(ctx, newKey) - c.Assert(err, check.IsNil) - c.Assert(resp.Kvs, check.HasLen, 1) - c.Assert(string(resp.Kvs[0].Value), check.Equals, newVal) + t.Require().NoError(err) + t.Require().Len(resp.Kvs, 1) + t.Require().Equal(newVal, string(resp.Kvs[0].Value)) for i := 0; i < 500; i++ { key := common.UpstreamConfigKeyAdapterV1.Encode(fmt.Sprintf("%s-%d", source, i)) val := fmt.Sprintf("%s-%d", oldVal, i) _, err := etcdTestCli.Put(ctx, key, val) - c.Assert(err, check.IsNil) + t.Require().NoError(err) } - c.Assert(upgradeToVer3(ctx, etcdTestCli), check.ErrorMatches, ".*too many operations in txn request.*") + err = upgradeToVer3(ctx, etcdTestCli) + t.Require().Error(err) + t.Require().Regexp(".*too many operations in txn request.*", err.Error()) } -func (t *testForBigTxn) TestUpgradeToVer3(c *check.C) { +func (t *testForBigTxn) TestUpgradeToVer3() { source := "source-1" oldVal := "test" ctx := context.Background() @@ -187,7 +183,7 @@ func (t *testForBigTxn) TestUpgradeToVer3(c *check.C) { key := common.UpstreamConfigKeyAdapterV1.Encode(fmt.Sprintf("%s-%d", source, i)) val := fmt.Sprintf("%s-%d", oldVal, i) _, err := bigTxnTestCli.Put(ctx, key, val) - c.Assert(err, check.IsNil) + t.Require().NoError(err) } - c.Assert(upgradeToVer3(ctx, bigTxnTestCli), check.IsNil) + t.Require().NoError(upgradeToVer3(ctx, bigTxnTestCli)) } diff --git a/dm/pkg/upgrade/version_test.go b/dm/pkg/upgrade/version_test.go index 02466a9fd1..c432bd5a3b 100644 --- a/dm/pkg/upgrade/version_test.go +++ b/dm/pkg/upgrade/version_test.go @@ -13,60 +13,56 @@ package upgrade -import ( - "github.com/pingcap/check" -) - -func (t *testForEtcd) TestVersionJSON(c *check.C) { +func (t *testForEtcd) TestVersionJSON() { v1 := NewVersion(1, "v2.0.0") j, err := v1.toJSON() - c.Assert(err, check.IsNil) - c.Assert(j, check.Equals, `{"internal-no":1,"release-ver":"v2.0.0"}`) - c.Assert(j, check.Equals, v1.String()) + t.Require().NoError(err) + t.Require().Equal(`{"internal-no":1,"release-ver":"v2.0.0"}`, j) + t.Require().Equal(v1.String(), j) v2, err := versionFromJSON(j) - c.Assert(err, check.IsNil) - c.Assert(v2, check.DeepEquals, v1) + t.Require().NoError(err) + t.Require().Equal(v1, v2) } -func (t *testForEtcd) TestVersionFunc(c *check.C) { +func (t *testForEtcd) TestVersionFunc() { var ve Version - c.Assert(ve.NotSet(), check.IsTrue) - c.Assert(CurrentVersion.NotSet(), check.IsFalse) + t.Require().True(ve.NotSet()) + t.Require().False(CurrentVersion.NotSet()) v1 := NewVersion(1, "v2.0.0") v2 := NewVersion(2, "v2.1.0") - c.Assert(v1.Compare(v2), check.Equals, -1) - c.Assert(v2.Compare(v1), check.Equals, 1) + t.Require().Equal(-1, v1.Compare(v2)) + t.Require().Equal(1, v2.Compare(v1)) v11 := v1 - c.Assert(v11.Compare(v1), check.Equals, 0) + t.Require().Equal(0, v11.Compare(v1)) // we only compare InternalNo now, if we should compare release version later, this should be fail. v12 := NewVersion(v1.InternalNo, "another-release-ver") - c.Assert(v12.Compare(v1), check.Equals, 0) + t.Require().Equal(0, v12.Compare(v1)) // MinVersion should < any current version. - c.Assert(MinVersion.Compare(CurrentVersion), check.Equals, -1) + t.Require().Equal(-1, MinVersion.Compare(CurrentVersion)) } -func (t *testForEtcd) TestVersionEtcd(c *check.C) { - defer clearTestData(c) +func (t *testForEtcd) TestVersionEtcd() { + defer clearTestData(t.T()) // try to get the version, but not exist. ver, rev1, err := GetVersion(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) - c.Assert(ver.NotSet(), check.IsTrue) + t.Require().NoError(err) + t.Require().Greater(rev1, int64(0)) + t.Require().True(ver.NotSet()) // put current version into etcd. rev2, err := PutVersion(etcdTestCli, CurrentVersion) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) + t.Require().NoError(err) + t.Require().Greater(rev2, rev1) // get the version back. ver, rev3, err := GetVersion(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Equals, rev2) - c.Assert(ver, check.DeepEquals, CurrentVersion) + t.Require().NoError(err) + t.Require().Equal(rev2, rev3) + t.Require().Equal(CurrentVersion, ver) } diff --git a/dm/pkg/v1dbschema/schema_test.go b/dm/pkg/v1dbschema/schema_test.go index 300b06a612..c97668450b 100644 --- a/dm/pkg/v1dbschema/schema_test.go +++ b/dm/pkg/v1dbschema/schema_test.go @@ -21,20 +21,21 @@ import ( "github.com/DATA-DOG/go-sqlmock" gmysql "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" "github.com/pingcap/failpoint" "github.com/pingcap/tiflow/dm/config" "github.com/pingcap/tiflow/dm/config/dbconfig" "github.com/pingcap/tiflow/dm/pkg/conn" tcontext "github.com/pingcap/tiflow/dm/pkg/context" "github.com/pingcap/tiflow/dm/pkg/gtid" + "github.com/stretchr/testify/suite" ) func TestSuite(t *testing.T) { - check.TestingT(t) + suite.Run(t, new(testSchema)) } type testSchema struct { + suite.Suite host string port int user string @@ -43,17 +44,15 @@ type testSchema struct { mockDB sqlmock.Sqlmock } -var _ = check.Suite(&testSchema{}) - -func (t *testSchema) SetUpSuite(c *check.C) { - t.setUpDBConn(c) +func (t *testSchema) SetupSuite() { + t.setUpDBConn() } -func (t *testSchema) TestTearDown(c *check.C) { +func (t *testSchema) TestTearDown() { t.db.Close() } -func (t *testSchema) setUpDBConn(c *check.C) { +func (t *testSchema) setUpDBConn() { t.host = os.Getenv("MYSQL_HOST") if t.host == "" { t.host = "127.0.0.1" @@ -78,12 +77,12 @@ func (t *testSchema) setUpDBConn(c *check.C) { cfg.Adjust() var err error - t.mockDB = conn.InitMockDB(c) + t.mockDB = conn.InitMockDB(t.T()) t.db, err = conn.GetUpstreamDB(cfg) - c.Assert(err, check.IsNil) + t.Require().NoError(err) } -func (t *testSchema) TestSchemaV106ToV20x(c *check.C) { +func (t *testSchema) TestSchemaV106ToV20x() { var ( tctx = tcontext.Background() cfg = &config.SubTaskConfig{ @@ -101,10 +100,10 @@ func (t *testSchema) TestSchemaV106ToV20x(c *check.C) { endGS, _ = gtid.ParserGTID(gmysql.MySQLFlavor, "ccb992ad-a557-11ea-ba6a-0242ac140002:1-16") ) - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/v1dbschema/MockGetGTIDsForPos", `return("ccb992ad-a557-11ea-ba6a-0242ac140002:10-16")`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/v1dbschema/MockGetGTIDsForPos", `return("ccb992ad-a557-11ea-ba6a-0242ac140002:10-16")`)) //nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/pkg/v1dbschema/MockGetGTIDsForPos") - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/conn/GetGTIDPurged", `return("ccb992ad-a557-11ea-ba6a-0242ac140002:1-9")`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/conn/GetGTIDPurged", `return("ccb992ad-a557-11ea-ba6a-0242ac140002:1-9")`)) //nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/pkg/conn/GetGTIDPurged") @@ -118,13 +117,13 @@ func (t *testSchema) TestSchemaV106ToV20x(c *check.C) { t.mockDB.ExpectBegin() t.mockDB.ExpectExec("UPDATE `dm_meta_v106_test`.`test_onlineddl`.*").WithArgs(cfg.SourceID, fmt.Sprint(cfg.ServerID)).WillReturnResult(sqlmock.NewErrorResult(nil)) t.mockDB.ExpectCommit() - c.Assert(UpdateSchema(tctx, t.db, cfg), check.IsNil) - c.Assert(t.mockDB.ExpectationsWereMet(), check.IsNil) + t.Require().NoError(UpdateSchema(tctx, t.db, cfg)) + t.Require().NoError(t.mockDB.ExpectationsWereMet()) // update schema with GTID enabled. cfg.EnableGTID = true // reset mockDB conn because last UpdateSchema would close the conn. - t.setUpDBConn(c) + t.setUpDBConn() // mock updateSyncerCheckpoint t.mockDB.ExpectQuery("SELECT binlog_name, binlog_pos FROM `dm_meta_v106_test`.`test_syncer_checkpoint`.*"). WithArgs(cfg.SourceID, true).WillReturnRows(sqlmock.NewRows([]string{"binlog_name", "binlog_pos"}). @@ -141,6 +140,6 @@ func (t *testSchema) TestSchemaV106ToV20x(c *check.C) { t.mockDB.ExpectBegin() t.mockDB.ExpectExec("UPDATE `dm_meta_v106_test`.`test_onlineddl`.*").WithArgs(cfg.SourceID, fmt.Sprint(cfg.ServerID)).WillReturnResult(sqlmock.NewErrorResult(nil)) t.mockDB.ExpectCommit() - c.Assert(UpdateSchema(tctx, t.db, cfg), check.IsNil) - c.Assert(t.mockDB.ExpectationsWereMet(), check.IsNil) + t.Require().NoError(UpdateSchema(tctx, t.db, cfg)) + t.Require().NoError(t.mockDB.ExpectationsWereMet()) } diff --git a/dm/pkg/v1workermeta/api_test.go b/dm/pkg/v1workermeta/api_test.go index 0406965bbf..ecb255816e 100644 --- a/dm/pkg/v1workermeta/api_test.go +++ b/dm/pkg/v1workermeta/api_test.go @@ -18,18 +18,15 @@ import ( "os" "path/filepath" "runtime" + "testing" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/pb" "github.com/pingcap/tiflow/dm/pkg/terror" "github.com/pingcap/tiflow/dm/pkg/utils" + "github.com/stretchr/testify/require" ) -type testAPI struct{} - -var _ = check.Suite(&testAPI{}) - -func (t *testAPI) TestAPI(c *check.C) { +func TestAPI(t *testing.T) { // nolint:dogsled _, currFile, _, _ := runtime.Caller(0) srcMetaPath := filepath.Join(filepath.Dir(currFile), "v106_data_for_test") @@ -42,116 +39,116 @@ func (t *testAPI) TestAPI(c *check.C) { dbPath = oldDBPath }() - metaPath = c.MkDir() + metaPath = t.TempDir() dbPath = filepath.Join(metaPath, "kv") // copy test data to a temp directory. - copyDir(c, dbPath, srcDBPath) + copyDir(t, dbPath, srcDBPath) // get subtasks meta. meta, err := GetSubtasksMeta() - c.Assert(err, check.IsNil) + require.NoError(t, err) // verify tasks meta. // - task_single: // - no shard task, Running stage. // - task_shard // - shard task, Paused stage. - c.Assert(meta, check.HasLen, 2) - c.Assert(meta, check.HasKey, "task_single") - c.Assert(meta, check.HasKey, "task_shard") - c.Assert(meta["task_single"].Stage, check.Equals, pb.Stage_Running) - c.Assert(meta["task_shard"].Stage, check.Equals, pb.Stage_Paused) + require.Len(t, meta, 2) + require.Contains(t, meta, "task_single") + require.Contains(t, meta, "task_shard") + require.Equal(t, pb.Stage_Running, meta["task_single"].Stage) + require.Equal(t, pb.Stage_Paused, meta["task_shard"].Stage) taskSingleCfg, err := SubTaskConfigFromV1TOML(meta["task_single"].Task) - c.Assert(err, check.IsNil) - c.Assert(taskSingleCfg.IsSharding, check.IsFalse) - c.Assert(taskSingleCfg.MydumperConfig.ChunkFilesize, check.Equals, "64") + require.NoError(t, err) + require.False(t, taskSingleCfg.IsSharding) + require.Equal(t, "64", taskSingleCfg.MydumperConfig.ChunkFilesize) taskShardCfg, err := SubTaskConfigFromV1TOML(meta["task_shard"].Task) - c.Assert(err, check.IsNil) - c.Assert(taskShardCfg.IsSharding, check.IsTrue) - c.Assert(taskSingleCfg.MydumperConfig.ChunkFilesize, check.Equals, "64") + require.NoError(t, err) + require.True(t, taskShardCfg.IsSharding) + require.Equal(t, "64", taskSingleCfg.MydumperConfig.ChunkFilesize) // try to get meta again, the same as before. meta2, err := GetSubtasksMeta() - c.Assert(err, check.IsNil) - c.Assert(meta2, check.DeepEquals, meta) + require.NoError(t, err) + require.Equal(t, meta, meta2) // remove all metadata. - c.Assert(RemoveSubtasksMeta(), check.IsNil) + require.NoError(t, RemoveSubtasksMeta()) // verify removed. - c.Assert(utils.IsDirExists(metaPath), check.IsFalse) + require.False(t, utils.IsDirExists(metaPath)) // try to get meta again, nothing exists. meta3, err := GetSubtasksMeta() - c.Assert(err, check.IsNil) - c.Assert(meta3, check.IsNil) + require.NoError(t, err) + require.Nil(t, meta3) // remove empty path is invalid. - c.Assert(terror.ErrInvalidV1WorkerMetaPath.Equal(RemoveSubtasksMeta()), check.IsTrue) + require.True(t, terror.ErrInvalidV1WorkerMetaPath.Equal(RemoveSubtasksMeta())) // remove an invalid meta path. - metaPath = c.MkDir() + metaPath = t.TempDir() dbPath = filepath.Join(metaPath, "kv") - c.Assert(os.Mkdir(dbPath, 0o644), check.IsNil) - c.Assert(terror.ErrInvalidV1WorkerMetaPath.Equal(RemoveSubtasksMeta()), check.IsTrue) + require.NoError(t, os.Mkdir(dbPath, 0o644)) + require.True(t, terror.ErrInvalidV1WorkerMetaPath.Equal(RemoveSubtasksMeta())) } -func copyDir(c *check.C, dst, src string) { +func copyDir(t *testing.T, dst, src string) { si, err := os.Stat(src) - c.Assert(err, check.IsNil) + require.NoError(t, err) if !si.IsDir() { - c.Fatalf("source %s is not a directory", src) + t.Fatalf("source %s is not a directory", src) } _, err = os.Stat(dst) if err != nil && !os.IsNotExist(err) { - c.Fatalf("fail to get stat for source %s", src) + t.Fatalf("fail to get stat for source %s", src) } if err == nil { - c.Fatalf("destination %s already exists", dst) + t.Fatalf("destination %s already exists", dst) } err = os.MkdirAll(dst, si.Mode()) - c.Assert(err, check.IsNil) + require.NoError(t, err) entries, err := os.ReadDir(src) - c.Assert(err, check.IsNil) + require.NoError(t, err) for _, entry := range entries { srcPath := filepath.Join(src, entry.Name()) dstPath := filepath.Join(dst, entry.Name()) if entry.IsDir() { - copyDir(c, dstPath, srcPath) + copyDir(t, dstPath, srcPath) } else { info, err := entry.Info() - c.Assert(err, check.IsNil) + require.NoError(t, err) // Skip symlinks. if info.Mode()&os.ModeSymlink != 0 { continue } - copyFile(c, dstPath, srcPath) + copyFile(t, dstPath, srcPath) } } } -func copyFile(c *check.C, dst, src string) { +func copyFile(t *testing.T, dst, src string) { in, err := os.Open(src) - c.Assert(err, check.IsNil) + require.NoError(t, err) defer in.Close() out, err := os.Create(dst) - c.Assert(err, check.IsNil) + require.NoError(t, err) defer out.Close() _, err = io.Copy(out, in) - c.Assert(err, check.IsNil) + require.NoError(t, err) si, err := os.Stat(src) - c.Assert(err, check.IsNil) + require.NoError(t, err) err = os.Chmod(dst, si.Mode()) - c.Assert(err, check.IsNil) + require.NoError(t, err) } diff --git a/dm/pkg/v1workermeta/meta_test.go b/dm/pkg/v1workermeta/meta_test.go index b7b9ffdbd1..b5e67ea325 100644 --- a/dm/pkg/v1workermeta/meta_test.go +++ b/dm/pkg/v1workermeta/meta_test.go @@ -17,21 +17,13 @@ import ( "path" "testing" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/config" "github.com/pingcap/tiflow/dm/pb" "github.com/pingcap/tiflow/dm/pkg/terror" + "github.com/stretchr/testify/require" "github.com/syndtr/goleveldb/leveldb" ) -func TestSuite(t *testing.T) { - check.TestingT(t) -} - -type testMeta struct{} - -var _ = check.Suite(&testMeta{}) - var ( testTask1 = &config.SubTaskConfig{ Name: "task1", @@ -46,12 +38,12 @@ var ( testTask2Meta *pb.V1SubTaskMeta ) -func testSetUpDB(c *check.C) *leveldb.DB { - c.Assert(testTask1.Adjust(true), check.IsNil) - c.Assert(testTask2.Adjust(true), check.IsNil) +func testSetUpDB(t *testing.T) *leveldb.DB { + require.NoError(t, testTask1.Adjust(true)) + require.NoError(t, testTask2.Adjust(true)) testTask1Str, err := testTask1.Toml() - c.Assert(err, check.IsNil) + require.NoError(t, err) testTask1Meta = &pb.V1SubTaskMeta{ Op: pb.TaskOp_Start, Name: testTask1.Name, @@ -60,7 +52,7 @@ func testSetUpDB(c *check.C) *leveldb.DB { } testTask2Str, err := testTask2.Toml() - c.Assert(err, check.IsNil) + require.NoError(t, err) testTask2Meta = &pb.V1SubTaskMeta{ Op: pb.TaskOp_Start, Name: testTask2.Name, @@ -68,68 +60,70 @@ func testSetUpDB(c *check.C) *leveldb.DB { Task: []byte(testTask2Str), } - dir := c.MkDir() + dir := t.TempDir() dbDir := path.Join(dir, "kv") db, err := openDB(dbDir, defaultKVConfig) if err != nil { - c.Fatalf("fail to open leveldb %v", err) + t.Fatalf("fail to open leveldb %v", err) } return db } -func (t *testMeta) TestNewMetaDB(c *check.C) { - db := testSetUpDB(c) +func TestNewMetaDB(t *testing.T) { + db := testSetUpDB(t) defer db.Close() metaDB, err := newMeta(db) - c.Assert(err, check.IsNil) - c.Assert(metaDB.tasks, check.HasLen, 0) + require.NoError(t, err) + require.Len(t, metaDB.tasks, 0) // check nil db metaDB, err = newMeta(nil) - c.Assert(terror.ErrWorkerLogInvalidHandler.Equal(err), check.IsTrue) - c.Assert(metaDB, check.IsNil) + require.True(t, terror.ErrWorkerLogInvalidHandler.Equal(err)) + require.Nil(t, metaDB) } -func (t *testMeta) TestTask(c *check.C) { - db := testSetUpDB(c) +func TestTask(t *testing.T) { + db := testSetUpDB(t) defer db.Close() // set task meta - c.Assert(terror.ErrWorkerLogInvalidHandler.Equal(setTaskMeta(nil, nil)), check.IsTrue) + require.True(t, terror.ErrWorkerLogInvalidHandler.Equal(setTaskMeta(nil, nil))) err := setTaskMeta(db, nil) - c.Assert(err, check.ErrorMatches, ".*empty task.*") + require.Error(t, err) + require.Regexp(t, ".*empty task.*", err.Error()) err = setTaskMeta(db, &pb.V1SubTaskMeta{}) - c.Assert(err, check.ErrorMatches, ".*empty task.*") + require.Error(t, err) + require.Regexp(t, ".*empty task.*", err.Error()) - c.Assert(setTaskMeta(db, testTask1Meta), check.IsNil) - c.Assert(setTaskMeta(db, testTask2Meta), check.IsNil) + require.NoError(t, setTaskMeta(db, testTask1Meta)) + require.NoError(t, setTaskMeta(db, testTask2Meta)) // load task meta metaDB, err := newMeta(db) - c.Assert(err, check.IsNil) - c.Assert(metaDB.tasks, check.DeepEquals, map[string]*pb.V1SubTaskMeta{ + require.NoError(t, err) + require.Equal(t, map[string]*pb.V1SubTaskMeta{ "task1": testTask1Meta, "task2": testTask2Meta, - }) + }, metaDB.tasks) // delete task meta - c.Assert(deleteTaskMeta(db, "task1"), check.IsNil) + require.NoError(t, deleteTaskMeta(db, "task1")) // load task meta metaDB, err = newMeta(db) - c.Assert(err, check.IsNil) - c.Assert(metaDB.tasks, check.DeepEquals, map[string]*pb.V1SubTaskMeta{ + require.NoError(t, err) + require.Equal(t, map[string]*pb.V1SubTaskMeta{ "task2": testTask2Meta, - }) + }, metaDB.tasks) // delete task meta - c.Assert(deleteTaskMeta(db, "task2"), check.IsNil) + require.NoError(t, deleteTaskMeta(db, "task2")) // load task meta metaDB, err = newMeta(db) - c.Assert(err, check.IsNil) - c.Assert(metaDB.tasks, check.HasLen, 0) + require.NoError(t, err) + require.Len(t, metaDB.tasks, 0) } diff --git a/dm/relay/file_test.go b/dm/relay/file_test.go index c5901be437..6a8be5a8c2 100644 --- a/dm/relay/file_test.go +++ b/dm/relay/file_test.go @@ -16,18 +16,15 @@ package relay import ( "os" "path/filepath" + "testing" - "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tiflow/dm/pkg/terror" "github.com/pingcap/tiflow/dm/pkg/utils" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testFileSuite{}) - -type testFileSuite struct{} - -func (t *testFileSuite) TestCollectBinlogFiles(c *check.C) { +func TestCollectBinlogFiles(t *testing.T) { var ( valid = []string{ "mysql-bin.000001", @@ -46,70 +43,70 @@ func (t *testFileSuite) TestCollectBinlogFiles(c *check.C) { ) files, err := CollectAllBinlogFiles("") - c.Assert(err, check.NotNil) - c.Assert(files, check.IsNil) + require.Error(t, err) + require.Nil(t, files) - dir := c.MkDir() + dir := t.TempDir() // create all valid binlog files for _, fn := range valid { err = os.WriteFile(filepath.Join(dir, fn), nil, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) } files, err = CollectAllBinlogFiles(dir) - c.Assert(err, check.IsNil) - c.Assert(files, check.DeepEquals, valid) + require.NoError(t, err) + require.Equal(t, valid, files) // create some invalid binlog files for _, fn := range invalid { err = os.WriteFile(filepath.Join(dir, fn), nil, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) } files, err = CollectAllBinlogFiles(dir) - c.Assert(err, check.IsNil) - c.Assert(files, check.DeepEquals, valid) + require.NoError(t, err) + require.Equal(t, valid, files) // create some invalid meta files for _, fn := range meta { err = os.WriteFile(filepath.Join(dir, fn), nil, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) } files, err = CollectAllBinlogFiles(dir) - c.Assert(err, check.IsNil) - c.Assert(files, check.DeepEquals, valid) + require.NoError(t, err) + require.Equal(t, valid, files) // collect newer files, none files, err = CollectBinlogFilesCmp(dir, valid[len(valid)-1], FileCmpBigger) - c.Assert(err, check.IsNil) - c.Assert(files, check.DeepEquals, []string{}) + require.NoError(t, err) + require.Equal(t, []string{}, files) // collect newer files, some files, err = CollectBinlogFilesCmp(dir, valid[0], FileCmpBigger) - c.Assert(err, check.IsNil) - c.Assert(files, check.DeepEquals, valid[1:]) + require.NoError(t, err) + require.Equal(t, valid[1:], files) // collect newer or equal files, all files, err = CollectBinlogFilesCmp(dir, valid[0], FileCmpBiggerEqual) - c.Assert(err, check.IsNil) - c.Assert(files, check.DeepEquals, valid) + require.NoError(t, err) + require.Equal(t, valid, files) // collect newer or equal files, some files, err = CollectBinlogFilesCmp(dir, valid[1], FileCmpBiggerEqual) - c.Assert(err, check.IsNil) - c.Assert(files, check.DeepEquals, valid[1:]) + require.NoError(t, err) + require.Equal(t, valid[1:], files) // collect older files, none files, err = CollectBinlogFilesCmp(dir, valid[0], FileCmpLess) - c.Assert(err, check.IsNil) - c.Assert(files, check.DeepEquals, []string{}) + require.NoError(t, err) + require.Equal(t, []string{}, files) // collect older files, some files, err = CollectBinlogFilesCmp(dir, valid[len(valid)-1], FileCmpLess) - c.Assert(err, check.IsNil) - c.Assert(files, check.DeepEquals, valid[:len(valid)-1]) + require.NoError(t, err) + require.Equal(t, valid[:len(valid)-1], files) } -func (t *testFileSuite) TestCollectBinlogFilesCmp(c *check.C) { +func TestCollectBinlogFilesCmp(t *testing.T) { var ( dir string baseFile string @@ -124,36 +121,37 @@ func (t *testFileSuite) TestCollectBinlogFilesCmp(c *check.C) { // empty dir files, err := CollectBinlogFilesCmp(dir, baseFile, cmp) - c.Assert(terror.ErrEmptyRelayDir.Equal(err), check.IsTrue) - c.Assert(files, check.IsNil) + require.True(t, terror.ErrEmptyRelayDir.Equal(err)) + require.Nil(t, files) // empty base filename, not found - dir = c.MkDir() + dir = t.TempDir() files, err = CollectBinlogFilesCmp(dir, baseFile, cmp) - c.Assert(errors.IsNotFound(err), check.IsTrue) - c.Assert(files, check.IsNil) + require.True(t, errors.IsNotFound(err)) + require.Nil(t, files) // base file not found baseFile = utils.MetaFilename files, err = CollectBinlogFilesCmp(dir, baseFile, cmp) - c.Assert(errors.IsNotFound(err), check.IsTrue) - c.Assert(files, check.IsNil) + require.True(t, errors.IsNotFound(err)) + require.Nil(t, files) // create a meta file filename := filepath.Join(dir, utils.MetaFilename) err = os.WriteFile(filename, nil, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) // invalid base filename, is a meta filename files, err = CollectBinlogFilesCmp(dir, baseFile, cmp) - c.Assert(err, check.ErrorMatches, ".*invalid binlog filename.*") - c.Assert(files, check.IsNil) + require.Error(t, err) + require.Regexp(t, ".*invalid binlog filename.*", err.Error()) + require.Nil(t, files) // create some binlog files for _, f := range binlogFiles { filename = filepath.Join(dir, f) err = os.WriteFile(filename, nil, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) } // > base file @@ -161,128 +159,133 @@ func (t *testFileSuite) TestCollectBinlogFilesCmp(c *check.C) { var i int for i, baseFile = range binlogFiles { files, err = CollectBinlogFilesCmp(dir, baseFile, cmp) - c.Assert(err, check.IsNil) - c.Assert(files, check.DeepEquals, binlogFiles[i+1:]) + require.NoError(t, err) + require.Equal(t, binlogFiles[i+1:], files) } // >= base file cmp = FileCmpBiggerEqual for i, baseFile = range binlogFiles { files, err = CollectBinlogFilesCmp(dir, baseFile, cmp) - c.Assert(err, check.IsNil) - c.Assert(files, check.DeepEquals, binlogFiles[i:]) + require.NoError(t, err) + require.Equal(t, binlogFiles[i:], files) } // < base file cmp = FileCmpLess for i, baseFile = range binlogFiles { files, err = CollectBinlogFilesCmp(dir, baseFile, cmp) - c.Assert(err, check.IsNil) - c.Assert(files, check.DeepEquals, binlogFiles[:i]) + require.NoError(t, err) + require.Equal(t, binlogFiles[:i], files) } // add a basename mismatch binlog file filename = filepath.Join(dir, "bin-mysql.100000") err = os.WriteFile(filename, nil, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) // test again, should ignore it for i, baseFile = range binlogFiles { files, err = CollectBinlogFilesCmp(dir, baseFile, cmp) - c.Assert(err, check.IsNil) - c.Assert(files, check.DeepEquals, binlogFiles[:i]) + require.NoError(t, err) + require.Equal(t, binlogFiles[:i], files) } // other cmp not supported yet cmps := []FileCmp{FileCmpLessEqual, FileCmpEqual} for _, cmp = range cmps { files, err = CollectBinlogFilesCmp(dir, baseFile, cmp) - c.Assert(err, check.ErrorMatches, ".*not supported.*") - c.Assert(files, check.IsNil) + require.Error(t, err) + require.Regexp(t, ".*not supported.*", err.Error()) + require.Nil(t, files) } } -func (t *testFileSuite) TestGetFirstBinlogName(c *check.C) { +func TestGetFirstBinlogName(t *testing.T) { var ( - baseDir = c.MkDir() + baseDir = t.TempDir() uuid = "b60868af-5a6f-11e9-9ea3-0242ac160006.000001" subDir = filepath.Join(baseDir, uuid) ) // sub directory not exist name, err := getFirstBinlogName(baseDir, uuid) - c.Assert(err, check.ErrorMatches, ".*(no such file or directory|The system cannot find the file specified).*") - c.Assert(name, check.Equals, "") + require.Error(t, err) + require.Regexp(t, ".*(no such file or directory|The system cannot find the file specified).*", err.Error()) + require.Equal(t, "", name) // empty directory err = os.MkdirAll(subDir, 0o700) - c.Assert(err, check.IsNil) + require.NoError(t, err) name, err = getFirstBinlogName(baseDir, uuid) - c.Assert(err, check.ErrorMatches, ".*not found.*") - c.Assert(name, check.Equals, "") + require.Error(t, err) + require.Regexp(t, ".*not found.*", err.Error()) + require.Equal(t, "", name) // has file, but not a valid binlog file. Now the error message is binlog files not found filename := "invalid.bin" err = os.WriteFile(filepath.Join(subDir, filename), nil, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, err = getFirstBinlogName(baseDir, uuid) - c.Assert(err, check.ErrorMatches, ".*not found.*") + require.Error(t, err) + require.Regexp(t, ".*not found.*", err.Error()) err = os.Remove(filepath.Join(subDir, filename)) - c.Assert(err, check.IsNil) + require.NoError(t, err) // has a valid binlog file filename = "z-mysql-bin.000002" // z prefix, make it become not the _first_ if possible. err = os.WriteFile(filepath.Join(subDir, filename), nil, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) name, err = getFirstBinlogName(baseDir, uuid) - c.Assert(err, check.IsNil) - c.Assert(name, check.Equals, filename) + require.NoError(t, err) + require.Equal(t, filename, name) // has one more earlier binlog file filename = "z-mysql-bin.000001" err = os.WriteFile(filepath.Join(subDir, filename), nil, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) name, err = getFirstBinlogName(baseDir, uuid) - c.Assert(err, check.IsNil) - c.Assert(name, check.Equals, filename) + require.NoError(t, err) + require.Equal(t, filename, name) // has a meta file err = os.WriteFile(filepath.Join(subDir, utils.MetaFilename), nil, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) name, err = getFirstBinlogName(baseDir, uuid) - c.Assert(err, check.IsNil) - c.Assert(name, check.Equals, filename) + require.NoError(t, err) + require.Equal(t, filename, name) } -func (t *testFileSuite) TestFileSizeUpdated(c *check.C) { +func TestFileSizeUpdated(t *testing.T) { var ( filename = "mysql-bin.000001" - filePath = filepath.Join(c.MkDir(), filename) + filePath = filepath.Join(t.TempDir(), filename) data = []byte("meaningless file content") latestSize = int64(len(data)) ) // file not exists cmp, err := fileSizeUpdated(filePath, latestSize) - c.Assert(err, check.ErrorMatches, ".*(no such file or directory|The system cannot find the file specified).*") - c.Assert(cmp, check.Equals, 0) + require.Error(t, err) + require.Regexp(t, ".*(no such file or directory|The system cannot find the file specified).*", err.Error()) + require.Equal(t, 0, cmp) // create and write the file err = os.WriteFile(filePath, data, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) // equal cmp, err = fileSizeUpdated(filePath, latestSize) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 0) + require.NoError(t, err) + require.Equal(t, 0, cmp) // less than cmp, err = fileSizeUpdated(filePath, latestSize+1) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, -1) + require.NoError(t, err) + require.Equal(t, -1, cmp) // greater than cmp, err = fileSizeUpdated(filePath, latestSize-1) - c.Assert(err, check.IsNil) - c.Assert(cmp, check.Equals, 1) + require.NoError(t, err) + require.Equal(t, 1, cmp) } diff --git a/dm/relay/file_util_test.go b/dm/relay/file_util_test.go index 46a4ca301d..1d5c57aa55 100644 --- a/dm/relay/file_util_test.go +++ b/dm/relay/file_util_test.go @@ -19,68 +19,68 @@ import ( "io" "os" "path/filepath" + "testing" "time" gmysql "github.com/go-mysql-org/go-mysql/mysql" "github.com/go-mysql-org/go-mysql/replication" - "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tiflow/dm/pkg/binlog/event" "github.com/pingcap/tiflow/dm/pkg/gtid" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testFileUtilSuite{}) - -type testFileUtilSuite struct{} - -func (t *testFileUtilSuite) TestCheckBinlogHeaderExist(c *check.C) { +func TestCheckBinlogHeaderExist(t *testing.T) { // file not exists - filename := filepath.Join(c.MkDir(), "test-mysql-bin.000001") + filename := filepath.Join(t.TempDir(), "test-mysql-bin.000001") exist, err := checkBinlogHeaderExist(filename) - c.Assert(err, check.ErrorMatches, ".*(no such file or directory|The system cannot find the file specified).*") - c.Assert(exist, check.IsFalse) + require.Error(t, err) + require.Regexp(t, ".*(no such file or directory|The system cannot find the file specified).*", err.Error()) + require.False(t, exist) // empty file err = os.WriteFile(filename, nil, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) exist, err = checkBinlogHeaderExist(filename) - c.Assert(err, check.IsNil) - c.Assert(exist, check.IsFalse) + require.NoError(t, err) + require.False(t, exist) // no enough data err = os.WriteFile(filename, replication.BinLogFileHeader[:len(replication.BinLogFileHeader)-1], 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) exist, err = checkBinlogHeaderExist(filename) - c.Assert(err, check.ErrorMatches, ".*has no enough data.*") - c.Assert(exist, check.IsFalse) + require.Error(t, err) + require.Regexp(t, ".*has no enough data.*", err.Error()) + require.False(t, exist) // equal err = os.WriteFile(filename, replication.BinLogFileHeader, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) exist, err = checkBinlogHeaderExist(filename) - c.Assert(err, check.IsNil) - c.Assert(exist, check.IsTrue) + require.NoError(t, err) + require.True(t, exist) // more data err = os.WriteFile(filename, bytes.Repeat(replication.BinLogFileHeader, 2), 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) exist, err = checkBinlogHeaderExist(filename) - c.Assert(err, check.IsNil) - c.Assert(exist, check.IsTrue) + require.NoError(t, err) + require.True(t, exist) // invalid data invalidData := make([]byte, len(replication.BinLogFileHeader)) copy(invalidData, replication.BinLogFileHeader) invalidData[0]++ err = os.WriteFile(filename, invalidData, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) exist, err = checkBinlogHeaderExist(filename) - c.Assert(err, check.ErrorMatches, ".*header not valid.*") - c.Assert(exist, check.IsFalse) + require.Error(t, err) + require.Regexp(t, ".*header not valid.*", err.Error()) + require.False(t, exist) } -func (t *testFileUtilSuite) TestCheckFormatDescriptionEventExist(c *check.C) { +func TestCheckFormatDescriptionEventExist(t *testing.T) { var ( header = &replication.EventHeader{ Timestamp: uint32(time.Now().Unix()), @@ -90,57 +90,61 @@ func (t *testFileUtilSuite) TestCheckFormatDescriptionEventExist(c *check.C) { latestPos uint32 = 4 ) formatDescEv, err := event.GenFormatDescriptionEvent(header, latestPos) - c.Assert(err, check.IsNil) + require.NoError(t, err) // file not exists - filename := filepath.Join(c.MkDir(), "test-mysql-bin.000001") + filename := filepath.Join(t.TempDir(), "test-mysql-bin.000001") exist, err := checkFormatDescriptionEventExist(filename) - c.Assert(err, check.ErrorMatches, ".*(no such file or directory|The system cannot find the file specified).*") - c.Assert(exist, check.IsFalse) + require.Error(t, err) + require.Regexp(t, ".*(no such file or directory|The system cannot find the file specified).*", err.Error()) + require.False(t, exist) // empty file err = os.WriteFile(filename, nil, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) exist, err = checkFormatDescriptionEventExist(filename) - c.Assert(err, check.ErrorMatches, ".*no binlog file header at the beginning.*") - c.Assert(exist, check.IsFalse) + require.Error(t, err) + require.Regexp(t, ".*no binlog file header at the beginning.*", err.Error()) + require.False(t, exist) // only file header err = os.WriteFile(filename, replication.BinLogFileHeader, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) exist, err = checkFormatDescriptionEventExist(filename) - c.Assert(err, check.IsNil) - c.Assert(exist, check.IsFalse) + require.NoError(t, err) + require.False(t, exist) // no enough data, < EventHeaderSize var buff bytes.Buffer buff.Write(replication.BinLogFileHeader) buff.Write(formatDescEv.RawData[:replication.EventHeaderSize-1]) err = os.WriteFile(filename, buff.Bytes(), 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) exist, err = checkFormatDescriptionEventExist(filename) - c.Assert(errors.Cause(err), check.Equals, io.EOF) - c.Assert(exist, check.IsFalse) + require.Equal(t, io.EOF, errors.Cause(err)) + require.False(t, exist) // no enough data, = EventHeaderSize buff.Reset() buff.Write(replication.BinLogFileHeader) buff.Write(formatDescEv.RawData[:replication.EventHeaderSize]) err = os.WriteFile(filename, buff.Bytes(), 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) exist, err = checkFormatDescriptionEventExist(filename) - c.Assert(err, check.ErrorMatches, ".*get event err EOF.*") - c.Assert(exist, check.IsFalse) + require.Error(t, err) + require.Regexp(t, ".*get event err EOF.*", err.Error()) + require.False(t, exist) // no enough data, > EventHeaderSize, < EventSize buff.Reset() buff.Write(replication.BinLogFileHeader) buff.Write(formatDescEv.RawData[:replication.EventHeaderSize+1]) err = os.WriteFile(filename, buff.Bytes(), 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) exist, err = checkFormatDescriptionEventExist(filename) - c.Assert(err, check.ErrorMatches, ".*get event err EOF.*") - c.Assert(exist, check.IsFalse) + require.Error(t, err) + require.Regexp(t, ".*get event err EOF.*", err.Error()) + require.False(t, exist) // exactly the event buff.Reset() @@ -149,33 +153,34 @@ func (t *testFileUtilSuite) TestCheckFormatDescriptionEventExist(c *check.C) { dataCopy := make([]byte, buff.Len()) copy(dataCopy, buff.Bytes()) err = os.WriteFile(filename, buff.Bytes(), 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) exist, err = checkFormatDescriptionEventExist(filename) - c.Assert(err, check.IsNil) - c.Assert(exist, check.IsTrue) + require.NoError(t, err) + require.True(t, exist) // more than the event buff.Write([]byte("more data")) err = os.WriteFile(filename, buff.Bytes(), 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) exist, err = checkFormatDescriptionEventExist(filename) - c.Assert(err, check.IsNil) - c.Assert(exist, check.IsTrue) + require.NoError(t, err) + require.True(t, exist) // other event type queryEv, err := event.GenQueryEvent(header, latestPos, 0, 0, 0, nil, []byte("schema"), []byte("BEGIN")) - c.Assert(err, check.IsNil) + require.NoError(t, err) buff.Reset() buff.Write(replication.BinLogFileHeader) buff.Write(queryEv.RawData) err = os.WriteFile(filename, buff.Bytes(), 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) exist, err = checkFormatDescriptionEventExist(filename) - c.Assert(err, check.ErrorMatches, ".*expect FormatDescriptionEvent.*") - c.Assert(exist, check.IsFalse) + require.Error(t, err) + require.Regexp(t, ".*expect FormatDescriptionEvent.*", err.Error()) + require.False(t, exist) } -func (t *testFileUtilSuite) TestCheckIsDuplicateEvent(c *check.C) { +func TestCheckIsDuplicateEvent(t *testing.T) { // use a binlog event generator to generate some binlog events. var ( flavor = gmysql.MySQLFlavor @@ -188,14 +193,14 @@ func (t *testFileUtilSuite) TestCheckIsDuplicateEvent(c *check.C) { allData bytes.Buffer ) previousGTIDSet, err := gtid.ParserGTID(flavor, previousGTIDSetStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) latestGTID, err := gtid.ParserGTID(flavor, latestGTIDStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) g, err := event.NewGenerator(flavor, serverID, latestPos, latestGTID, previousGTIDSet, latestXID) - c.Assert(err, check.IsNil) + require.NoError(t, err) // file header with FormatDescriptionEvent and PreviousGTIDsEvent events, data, err := g.GenFileHeader(0) - c.Assert(err, check.IsNil) + require.NoError(t, err) allEvents = append(allEvents, events...) allData.Write(data) // CREATE DATABASE/TABLE @@ -206,28 +211,28 @@ func (t *testFileUtilSuite) TestCheckIsDuplicateEvent(c *check.C) { } for _, query := range queries { events, data, err = g.GenDDLEvents("db", query, 0) - c.Assert(err, check.IsNil) + require.NoError(t, err) allEvents = append(allEvents, events...) allData.Write(data) } // write the events to a file - filename := filepath.Join(c.MkDir(), "test-mysql-bin.000001") + filename := filepath.Join(t.TempDir(), "test-mysql-bin.000001") err = os.WriteFile(filename, allData.Bytes(), 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) // all events in the file for _, ev := range allEvents { duplicate, err2 := checkIsDuplicateEvent(filename, ev) - c.Assert(err2, check.IsNil) - c.Assert(duplicate, check.IsTrue) + require.Nil(t, err2) + require.True(t, duplicate) } // event not in the file, because its start pos > file size events, _, err = g.GenDDLEvents("", "BEGIN", 0) - c.Assert(err, check.IsNil) + require.NoError(t, err) duplicate, err := checkIsDuplicateEvent(filename, events[0]) - c.Assert(err, check.IsNil) - c.Assert(duplicate, check.IsFalse) + require.NoError(t, err) + require.False(t, duplicate) // event not in the file, because event start pos < file size < event end pos, invalid lastEvent := allEvents[len(allEvents)-1] @@ -235,39 +240,43 @@ func (t *testFileUtilSuite) TestCheckIsDuplicateEvent(c *check.C) { latestPos = lastEvent.Header.LogPos - lastEvent.Header.EventSize eventSize := lastEvent.Header.EventSize + 1 // greater event size dummyEv, err := event.GenDummyEvent(&header, latestPos, eventSize) - c.Assert(err, check.IsNil) + require.NoError(t, err) duplicate, err = checkIsDuplicateEvent(filename, dummyEv) - c.Assert(err, check.ErrorMatches, ".*file size.*is between event's start pos.*") - c.Assert(duplicate, check.IsFalse) + require.Error(t, err) + require.Regexp(t, ".*file size.*is between event's start pos.*", err.Error()) + require.False(t, duplicate) // event's start pos not match any event in the file, invalid latestPos = lastEvent.Header.LogPos - lastEvent.Header.EventSize - 1 // start pos mismatch eventSize = lastEvent.Header.EventSize dummyEv, err = event.GenDummyEvent(&header, latestPos, eventSize) - c.Assert(err, check.IsNil) + require.NoError(t, err) duplicate, err = checkIsDuplicateEvent(filename, dummyEv) - c.Assert(err, check.ErrorMatches, "*diff from passed-in event.*") - c.Assert(duplicate, check.IsFalse) + require.Error(t, err) + require.Regexp(t, ".*diff from passed-in event.*", err.Error()) + require.False(t, duplicate) // event's start/end pos matched, but content mismatched, invalid latestPos = lastEvent.Header.LogPos - lastEvent.Header.EventSize eventSize = lastEvent.Header.EventSize dummyEv, err = event.GenDummyEvent(&header, latestPos, eventSize) - c.Assert(err, check.IsNil) + require.NoError(t, err) duplicate, err = checkIsDuplicateEvent(filename, dummyEv) - c.Assert(err, check.ErrorMatches, ".*diff from passed-in event.*") - c.Assert(duplicate, check.IsFalse) + require.Error(t, err) + require.Regexp(t, ".*diff from passed-in event.*", err.Error()) + require.False(t, duplicate) // file not exists, invalid filename += ".no-exist" duplicate, err = checkIsDuplicateEvent(filename, lastEvent) - c.Assert(err, check.ErrorMatches, ".*get stat for.*") - c.Assert(duplicate, check.IsFalse) + require.Error(t, err) + require.Regexp(t, ".*get stat for.*", err.Error()) + require.False(t, duplicate) } -func (t *testFileUtilSuite) TestGetTxnPosGTIDsMySQL(c *check.C) { +func TestGetTxnPosGTIDsMySQL(t *testing.T) { var ( - filename = filepath.Join(c.MkDir(), "test-mysql-bin.000001") + filename = filepath.Join(t.TempDir(), "test-mysql-bin.000001") flavor = gmysql.MySQLFlavor previousGTIDSetStr = "3ccc475b-2343-11e7-be21-6c0b84d59f30:1-14,53bfca22-690d-11e7-8a62-18ded7a37b78:1-495,406a3f61-690d-11e7-87c5-6c92bf46f384:123-456,686e1ab6-c47e-11e7-a42c-6c92bf46f384:234-567" latestGTIDStr1 = "3ccc475b-2343-11e7-be21-6c0b84d59f30:14" @@ -278,12 +287,12 @@ func (t *testFileUtilSuite) TestGetTxnPosGTIDsMySQL(c *check.C) { expectedGTIDsStr2 = "3ccc475b-2343-11e7-be21-6c0b84d59f30:1-18,53bfca22-690d-11e7-8a62-18ded7a37b78:1-506,406a3f61-690d-11e7-87c5-6c92bf46f384:123-456,686e1ab6-c47e-11e7-a42c-6c92bf46f384:234-567" ) - t.testGetTxnPosGTIDs(c, filename, flavor, previousGTIDSetStr, latestGTIDStr1, latestGTIDStr2, expectedGTIDsStr1, expectedGTIDsStr2) + testGetTxnPosGTIDs(t, filename, flavor, previousGTIDSetStr, latestGTIDStr1, latestGTIDStr2, expectedGTIDsStr1, expectedGTIDsStr2) } -func (t *testFileUtilSuite) TestGetTxnPosGTIDMariaDB(c *check.C) { +func TestGetTxnPosGTIDMariaDB(t *testing.T) { var ( - filename = filepath.Join(c.MkDir(), "test-mysql-bin.000001") + filename = filepath.Join(t.TempDir(), "test-mysql-bin.000001") flavor = gmysql.MariaDBFlavor previousGTIDSetStr = "1-11-1,2-11-2" latestGTIDStr1 = "1-11-1" @@ -294,38 +303,38 @@ func (t *testFileUtilSuite) TestGetTxnPosGTIDMariaDB(c *check.C) { expectedGTIDsStr2 = "1-11-5,2-11-13" ) - t.testGetTxnPosGTIDs(c, filename, flavor, previousGTIDSetStr, latestGTIDStr1, latestGTIDStr2, expectedGTIDsStr1, expectedGTIDsStr2) + testGetTxnPosGTIDs(t, filename, flavor, previousGTIDSetStr, latestGTIDStr1, latestGTIDStr2, expectedGTIDsStr1, expectedGTIDsStr2) } -func (t *testFileUtilSuite) testGetTxnPosGTIDs(c *check.C, filename, flavor, previousGTIDSetStr, +func testGetTxnPosGTIDs(t *testing.T, filename, flavor, previousGTIDSetStr, latestGTIDStr1, latestGTIDStr2, expectedGTIDsStr1, expectedGTIDsStr2 string, ) { parser2 := parser.New() // different SIDs in GTID set previousGTIDSet, err := gtid.ParserGTID(flavor, previousGTIDSetStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) latestGTID1, err := gtid.ParserGTID(flavor, latestGTIDStr1) - c.Assert(err, check.IsNil) + require.NoError(t, err) latestGTID2, err := gtid.ParserGTID(flavor, latestGTIDStr2) - c.Assert(err, check.IsNil) + require.NoError(t, err) - g, _, baseData := genBinlogEventsWithGTIDs(c, flavor, previousGTIDSet, latestGTID1, latestGTID2) + g, _, baseData := genBinlogEventsWithGTIDs(t, flavor, previousGTIDSet, latestGTID1, latestGTID2) // expected latest pos/GTID set expectedPos := int64(len(baseData)) expectedGTIDs, err := gtid.ParserGTID(flavor, expectedGTIDsStr1) // 3 DDL + 10 DML - c.Assert(err, check.IsNil) + require.NoError(t, err) // write the events to a file err = os.WriteFile(filename, baseData, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) // not extra data exists pos, gSet, err := getTxnPosGTIDs(context.Background(), filename, parser2) - c.Assert(err, check.IsNil) - c.Assert(pos, check.DeepEquals, expectedPos) - c.Assert(gSet, check.DeepEquals, expectedGTIDs) + require.NoError(t, err) + require.Equal(t, expectedPos, pos) + require.Equal(t, expectedGTIDs, gSet) // generate another transaction, DML var ( @@ -347,62 +356,62 @@ func (t *testFileUtilSuite) testGetTxnPosGTIDs(c *check.C, filename, flavor, pre }, } extraEvents, extraData, err := g.GenDMLEvents(eventType, dmlData, 0) - c.Assert(err, check.IsNil) - c.Assert(extraEvents, check.HasLen, 5) // [GTID, BEGIN, TableMap, UPDATE, XID] + require.NoError(t, err) + require.Len(t, extraEvents, 5) // [GTID, BEGIN, TableMap, UPDATE, XID] // write an incomplete event to the file corruptData := extraEvents[0].RawData[:len(extraEvents[0].RawData)-2] f, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, err = f.Write(corruptData) - c.Assert(err, check.IsNil) - c.Assert(f.Close(), check.IsNil) + require.NoError(t, err) + require.NoError(t, f.Close()) // check again pos, gSet, err = getTxnPosGTIDs(context.Background(), filename, parser2) - c.Assert(err, check.IsNil) - c.Assert(pos, check.DeepEquals, expectedPos) - c.Assert(gSet, check.DeepEquals, expectedGTIDs) + require.NoError(t, err) + require.Equal(t, expectedPos, pos) + require.Equal(t, expectedGTIDs, gSet) // truncate extra data f, err = os.OpenFile(filename, os.O_WRONLY, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) err = f.Truncate(expectedPos) - c.Assert(err, check.IsNil) - c.Assert(f.Close(), check.IsNil) + require.NoError(t, err) + require.NoError(t, f.Close()) // write an incomplete transaction with some completed events for i := 0; i < len(extraEvents)-1; i++ { f, err = os.OpenFile(filename, os.O_WRONLY|os.O_APPEND, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, err = f.Write(extraEvents[i].RawData) // write the event - c.Assert(err, check.IsNil) - c.Assert(f.Close(), check.IsNil) + require.NoError(t, err) + require.NoError(t, f.Close()) // check again pos, gSet, err = getTxnPosGTIDs(context.Background(), filename, parser2) - c.Assert(err, check.IsNil) - c.Assert(pos, check.DeepEquals, expectedPos) - c.Assert(gSet, check.DeepEquals, expectedGTIDs) + require.NoError(t, err) + require.Equal(t, expectedPos, pos) + require.Equal(t, expectedGTIDs, gSet) } // write a completed event (and a completed transaction) to the file f, err = os.OpenFile(filename, os.O_WRONLY|os.O_APPEND, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, err = f.Write(extraEvents[len(extraEvents)-1].RawData) // write the event - c.Assert(err, check.IsNil) - c.Assert(f.Close(), check.IsNil) + require.NoError(t, err) + require.NoError(t, f.Close()) // check again expectedPos += int64(len(extraData)) expectedGTIDs, err = gtid.ParserGTID(flavor, expectedGTIDsStr2) // 3 DDL + 11 DML - c.Assert(err, check.IsNil) + require.NoError(t, err) pos, gSet, err = getTxnPosGTIDs(context.Background(), filename, parser2) - c.Assert(err, check.IsNil) - c.Assert(pos, check.DeepEquals, expectedPos) - c.Assert(gSet, check.DeepEquals, expectedGTIDs) + require.NoError(t, err) + require.Equal(t, expectedPos, pos) + require.Equal(t, expectedGTIDs, gSet) } -func (t *testFileUtilSuite) TestGetTxnPosGTIDsNoGTID(c *check.C) { +func TestGetTxnPosGTIDsNoGTID(t *testing.T) { // generate some events but without GTID enabled var ( header = &replication.EventHeader{ @@ -410,38 +419,38 @@ func (t *testFileUtilSuite) TestGetTxnPosGTIDsNoGTID(c *check.C) { ServerID: 11, } latestPos uint32 = 4 - filename = filepath.Join(c.MkDir(), "test-mysql-bin.000001") + filename = filepath.Join(t.TempDir(), "test-mysql-bin.000001") ) // FormatDescriptionEvent formatDescEv, err := event.GenFormatDescriptionEvent(header, latestPos) - c.Assert(err, check.IsNil) + require.NoError(t, err) latestPos = formatDescEv.Header.LogPos // QueryEvent, DDL queryEv, err := event.GenQueryEvent(header, latestPos, 0, 0, 0, nil, []byte("db"), []byte("CREATE DATABASE db")) - c.Assert(err, check.IsNil) + require.NoError(t, err) latestPos = queryEv.Header.LogPos // write events to the file f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, err = f.Write(replication.BinLogFileHeader) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, err = f.Write(formatDescEv.RawData) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, err = f.Write(queryEv.RawData) - c.Assert(err, check.IsNil) - c.Assert(f.Close(), check.IsNil) + require.NoError(t, err) + require.NoError(t, f.Close()) // check latest pos/GTID set pos, gSet, err := getTxnPosGTIDs(context.Background(), filename, parser.New()) - c.Assert(err, check.IsNil) - c.Assert(pos, check.Equals, int64(latestPos)) - c.Assert(gSet, check.IsNil) // GTID not enabled + require.NoError(t, err) + require.Equal(t, int64(latestPos), pos) + require.Nil(t, gSet) // GTID not enabled } -func (t *testFileUtilSuite) TestGetTxnPosGTIDsIllegalGTIDMySQL(c *check.C) { +func TestGetTxnPosGTIDsIllegalGTIDMySQL(t *testing.T) { // generate some events with GTID enabled, but without PreviousGTIDEvent var ( header = &replication.EventHeader{ @@ -453,12 +462,12 @@ func (t *testFileUtilSuite) TestGetTxnPosGTIDsIllegalGTIDMySQL(c *check.C) { // GTID event gtidEv, err := event.GenGTIDEvent(header, latestPos, 0, "3ccc475b-2343-11e7-be21-6c0b84d59f30", 14, 10, 10) - c.Assert(err, check.IsNil) + require.NoError(t, err) - t.testGetTxnPosGTIDsIllegalGTID(c, gtidEv, ".*should have a PreviousGTIDsEvent before the GTIDEvent.*") + testGetTxnPosGTIDsIllegalGTID(t, gtidEv, ".*should have a PreviousGTIDsEvent before the GTIDEvent.*") } -func (t *testFileUtilSuite) TestGetTxnPosGTIDsIllegalGTIDMairaDB(c *check.C) { +func TestGetTxnPosGTIDsIllegalGTIDMairaDB(t *testing.T) { // generate some events with GTID enabled, but without MariaDBGTIDEvent var ( header = &replication.EventHeader{ @@ -470,44 +479,45 @@ func (t *testFileUtilSuite) TestGetTxnPosGTIDsIllegalGTIDMairaDB(c *check.C) { // GTID event mariaDBGTIDEv, err := event.GenMariaDBGTIDEvent(header, latestPos, 10, 10) - c.Assert(err, check.IsNil) + require.NoError(t, err) - t.testGetTxnPosGTIDsIllegalGTID(c, mariaDBGTIDEv, ".*should have a MariadbGTIDListEvent before the MariadbGTIDEvent.*") + testGetTxnPosGTIDsIllegalGTID(t, mariaDBGTIDEv, ".*should have a MariadbGTIDListEvent before the MariadbGTIDEvent.*") } -func (t *testFileUtilSuite) testGetTxnPosGTIDsIllegalGTID(c *check.C, gtidEv *replication.BinlogEvent, errRegStr string) { +func testGetTxnPosGTIDsIllegalGTID(t *testing.T, gtidEv *replication.BinlogEvent, errRegStr string) { var ( header = &replication.EventHeader{ Timestamp: uint32(time.Now().Unix()), ServerID: 11, } latestPos uint32 = 4 - filename = filepath.Join(c.MkDir(), "test-mysql-bin.000001") + filename = filepath.Join(t.TempDir(), "test-mysql-bin.000001") ) // FormatDescriptionEvent formatDescEv, err := event.GenFormatDescriptionEvent(header, latestPos) - c.Assert(err, check.IsNil) + require.NoError(t, err) // write events to the file f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, err = f.Write(replication.BinLogFileHeader) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, err = f.Write(formatDescEv.RawData) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, err = f.Write(gtidEv.RawData) - c.Assert(err, check.IsNil) - c.Assert(f.Close(), check.IsNil) + require.NoError(t, err) + require.NoError(t, f.Close()) // check latest pos/GTID set pos, gSet, err := getTxnPosGTIDs(context.Background(), filename, parser.New()) - c.Assert(err, check.ErrorMatches, errRegStr) - c.Assert(pos, check.Equals, int64(0)) - c.Assert(gSet, check.IsNil) + require.Error(t, err) + require.Regexp(t, errRegStr, err.Error()) + require.Equal(t, int64(0), pos) + require.Nil(t, gSet) } -func (t *testFileUtilSuite) TestDontTruncateOnlyHeader(c *check.C) { +func TestDontTruncateOnlyHeader(t *testing.T) { var ( header = &replication.EventHeader{ Timestamp: uint32(time.Now().Unix()), @@ -519,35 +529,35 @@ func (t *testFileUtilSuite) TestDontTruncateOnlyHeader(c *check.C) { ) formatDescEv, err := event.GenFormatDescriptionEvent(header, uint32(latestPos)) - c.Assert(err, check.IsNil) + require.NoError(t, err) latestPos += len(formatDescEv.RawData) mysqlGTIDev, _ := event.GenPreviousGTIDsEvent(header, uint32(latestPos), previousGSetMySQL) mariaDBGTIDev, _ := event.GenMariaDBGTIDListEvent(header, uint32(latestPos), previousGSetMariaDB) - t.testDontTruncate(c, []*replication.BinlogEvent{formatDescEv, mysqlGTIDev}) - t.testDontTruncate(c, []*replication.BinlogEvent{formatDescEv, mariaDBGTIDev}) + testDontTruncate(t, []*replication.BinlogEvent{formatDescEv, mysqlGTIDev}) + testDontTruncate(t, []*replication.BinlogEvent{formatDescEv, mariaDBGTIDev}) } -func (t *testFileUtilSuite) testDontTruncate(c *check.C, events []*replication.BinlogEvent) { +func testDontTruncate(t *testing.T, events []*replication.BinlogEvent) { var ( - filename = filepath.Join(c.MkDir(), "dont-truncate.000001") + filename = filepath.Join(t.TempDir(), "dont-truncate.000001") parser2 = parser.New() ) f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, err = f.Write(replication.BinLogFileHeader) - c.Assert(err, check.IsNil) + require.NoError(t, err) for _, ev := range events { _, err = f.Write(ev.RawData) - c.Assert(err, check.IsNil) + require.NoError(t, err) stat, _ := f.Stat() pos, _, err := getTxnPosGTIDs(context.Background(), filename, parser2) - c.Assert(err, check.IsNil) - c.Assert(pos, check.Equals, stat.Size()) + require.NoError(t, err) + require.Equal(t, stat.Size(), pos) } } diff --git a/dm/relay/local_reader_test.go b/dm/relay/local_reader_test.go index addf7595fa..c72300db53 100644 --- a/dm/relay/local_reader_test.go +++ b/dm/relay/local_reader_test.go @@ -25,13 +25,13 @@ import ( "strconv" "strings" "sync" + "testing" "time" "github.com/BurntSushi/toml" gmysql "github.com/go-mysql-org/go-mysql/mysql" "github.com/go-mysql-org/go-mysql/replication" "github.com/google/uuid" - "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tiflow/dm/pkg/binlog/event" @@ -40,27 +40,32 @@ import ( "github.com/pingcap/tiflow/dm/pkg/log" "github.com/pingcap/tiflow/dm/pkg/terror" "github.com/pingcap/tiflow/dm/pkg/utils" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" ) var parseFileTimeout = 10 * time.Second -var _ = check.Suite(&testReaderSuite{}) +func TestReaderSuite(t *testing.T) { + suite.Run(t, new(testReaderSuite)) +} type testReaderSuite struct { + suite.Suite lastPos uint32 lastGTID gmysql.GTIDSet } -func (t *testReaderSuite) SetUpSuite(c *check.C) { +func (t *testReaderSuite) SetupSuite() { var err error t.lastPos = 0 t.lastGTID, err = gtid.ParserGTID(gmysql.MySQLFlavor, "ba8f633f-1f15-11eb-b1c7-0242ac110002:1") - c.Assert(err, check.IsNil) - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval", "return(10000)"), check.IsNil) + t.Require().NoError(err) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval", "return(10000)")) } -func (t *testReaderSuite) TearDownSuite(c *check.C) { - c.Assert(failpoint.Disable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval"), check.IsNil) +func (t *testReaderSuite) TearDownSuite() { + t.Require().NoError(failpoint.Disable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval")) } func newBinlogReaderForTest(logger log.Logger, cfg *BinlogReaderConfig, notify bool, uuid string) *BinlogReader { @@ -81,10 +86,10 @@ func (t *testReaderSuite) setActiveRelayLog(r Process, uuid, filename string, of writer.out.offset.Store(offset) } -func (t *testReaderSuite) createBinlogFileParseState(c *check.C, relayLogDir, relayLogFile string, offset int64, possibleLast bool) *binlogFileParseState { +func (t *testReaderSuite) createBinlogFileParseState(relayLogDir, relayLogFile string, offset int64, possibleLast bool) *binlogFileParseState { fullPath := filepath.Join(relayLogDir, relayLogFile) f, err := os.Open(fullPath) - c.Assert(err, check.IsNil) + t.Require().NoError(err) return &binlogFileParseState{ possibleLast: possibleLast, @@ -97,9 +102,9 @@ func (t *testReaderSuite) createBinlogFileParseState(c *check.C, relayLogDir, re } } -func (t *testReaderSuite) TestparseFileAsPossibleFileNotExist(c *check.C) { +func (t *testReaderSuite) TestparseFileAsPossibleFileNotExist() { var ( - baseDir = c.MkDir() + baseDir = t.T().TempDir() currentUUID = "b60868af-5a6f-11e9-9ea3-0242ac160006.000001" filename = "test-mysql-bin.000001" relayDir = path.Join(baseDir, currentUUID) @@ -107,17 +112,18 @@ func (t *testReaderSuite) TestparseFileAsPossibleFileNotExist(c *check.C) { cfg := &BinlogReaderConfig{RelayDir: baseDir, Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, true, currentUUID) needSwitch, lastestPos, err := r.parseFileAsPossible(context.Background(), nil, filename, 4, relayDir, true, false) - c.Assert(needSwitch, check.IsFalse) - c.Assert(lastestPos, check.Equals, int64(0)) - c.Assert(err, check.ErrorMatches, ".*no such file or directory.*") + t.Require().False(needSwitch) + t.Require().Equal(int64(0), lastestPos) + t.Require().Error(err) + t.Require().Regexp(".*no such file or directory.*", err.Error()) } -func (t *testReaderSuite) TestParseFileBase(c *check.C) { +func (t *testReaderSuite) TestParseFileBase() { var ( filename = "test-mysql-bin.000001" - baseDir = c.MkDir() + baseDir = t.T().TempDir() possibleLast = false - baseEvents, _, _ = t.genBinlogEvents(c, t.lastPos, t.lastGTID) + baseEvents, _, _ = t.genBinlogEvents(t.lastPos, t.lastGTID) s = newLocalStreamer() ) ctx, cancel := context.WithCancel(context.Background()) @@ -128,9 +134,9 @@ func (t *testReaderSuite) TestParseFileBase(c *check.C) { relayDir := filepath.Join(baseDir, currentUUID) fullPath := filepath.Join(relayDir, filename) err1 := os.MkdirAll(relayDir, 0o700) - c.Assert(err1, check.IsNil) + t.Require().Nil(err1) f, err1 := os.OpenFile(fullPath, os.O_CREATE|os.O_WRONLY, 0o600) - c.Assert(err1, check.IsNil) + t.Require().Nil(err1) defer f.Close() // empty relay log file, got EOF when reading format description event separately and possibleLast = false @@ -140,26 +146,26 @@ func (t *testReaderSuite) TestParseFileBase(c *check.C) { cfg := &BinlogReaderConfig{RelayDir: baseDir, Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, true, currentUUID) t.setActiveRelayLog(r.relay, currentUUID, filename, 0) - state := t.createBinlogFileParseState(c, relayDir, filename, 100, possibleLast) + state := t.createBinlogFileParseState(relayDir, filename, 100, possibleLast) needSwitch, needReParse, err := r.parseFile(testCtx, s, true, state) - c.Assert(errors.Cause(err), check.Equals, io.EOF) - c.Assert(needSwitch, check.IsFalse) - c.Assert(needReParse, check.IsFalse) - c.Assert(state.latestPos, check.Equals, int64(100)) - c.Assert(state.formatDescEventRead, check.IsFalse) - c.Assert(state.skipGTID, check.Equals, false) + t.Require().Equal(io.EOF, errors.Cause(err)) + t.Require().False(needSwitch) + t.Require().False(needReParse) + t.Require().Equal(int64(100), state.latestPos) + t.Require().False(state.formatDescEventRead) + t.Require().Equal(false, state.skipGTID) } // write some events to binlog file _, err1 = f.Write(replication.BinLogFileHeader) - c.Assert(err1, check.IsNil) + t.Require().Nil(err1) for _, ev := range baseEvents { _, err1 = f.Write(ev.RawData) - c.Assert(err1, check.IsNil) + t.Require().Nil(err1) } fileSize, _ := f.Seek(0, io.SeekCurrent) - t.purgeStreamer(c, s) + t.purgeStreamer(s) // base test with only one valid binlog file { @@ -168,35 +174,35 @@ func (t *testReaderSuite) TestParseFileBase(c *check.C) { cfg := &BinlogReaderConfig{RelayDir: baseDir, Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, true, currentUUID) t.setActiveRelayLog(r.relay, currentUUID, filename, fileSize) - state := t.createBinlogFileParseState(c, relayDir, filename, 4, possibleLast) + state := t.createBinlogFileParseState(relayDir, filename, 4, possibleLast) needSwitch, needReParse, err := r.parseFile(testCtx, s, true, state) - c.Assert(err, check.IsNil) - c.Assert(needSwitch, check.IsFalse) - c.Assert(needReParse, check.IsFalse) - c.Assert(state.latestPos, check.Equals, int64(baseEvents[len(baseEvents)-1].Header.LogPos)) - c.Assert(state.formatDescEventRead, check.IsTrue) - c.Assert(state.skipGTID, check.IsFalse) + t.Require().NoError(err) + t.Require().False(needSwitch) + t.Require().False(needReParse) + t.Require().Equal(int64(baseEvents[len(baseEvents)-1].Header.LogPos), state.latestPos) + t.Require().True(state.formatDescEventRead) + t.Require().False(state.skipGTID) // try get events back, firstParse should have fake RotateEvent var fakeRotateEventCount int i := 0 for { ev, err2 := s.GetEvent(ctx) - c.Assert(err2, check.IsNil) + t.Require().Nil(err2) if ev.Header.Timestamp == 0 || ev.Header.LogPos == 0 { if ev.Header.EventType == replication.ROTATE_EVENT { fakeRotateEventCount++ } continue // ignore fake event } - c.Assert(ev, check.DeepEquals, baseEvents[i]) + t.Require().Equal(baseEvents[i], ev) i++ if i >= len(baseEvents) { break } } - c.Assert(fakeRotateEventCount, check.Equals, 1) - t.verifyNoEventsInStreamer(c, s) + t.Require().Equal(1, fakeRotateEventCount) + t.verifyNoEventsInStreamer(s) } // try get events back, since firstParse=false, should have no fake RotateEvent @@ -206,40 +212,40 @@ func (t *testReaderSuite) TestParseFileBase(c *check.C) { cfg := &BinlogReaderConfig{RelayDir: baseDir, Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, true, currentUUID) t.setActiveRelayLog(r.relay, currentUUID, filename, fileSize) - state := t.createBinlogFileParseState(c, relayDir, filename, 4, possibleLast) + state := t.createBinlogFileParseState(relayDir, filename, 4, possibleLast) needSwitch, needReParse, err := r.parseFile(testCtx, s, false, state) - c.Assert(err, check.IsNil) - c.Assert(needSwitch, check.IsFalse) - c.Assert(needReParse, check.IsFalse) - c.Assert(state.latestPos, check.Equals, int64(baseEvents[len(baseEvents)-1].Header.LogPos)) - c.Assert(state.formatDescEventRead, check.IsTrue) - c.Assert(state.skipGTID, check.Equals, false) + t.Require().NoError(err) + t.Require().False(needSwitch) + t.Require().False(needReParse) + t.Require().Equal(int64(baseEvents[len(baseEvents)-1].Header.LogPos), state.latestPos) + t.Require().True(state.formatDescEventRead) + t.Require().Equal(false, state.skipGTID) fakeRotateEventCount := 0 i := 0 for { ev, err2 := s.GetEvent(ctx) - c.Assert(err2, check.IsNil) + t.Require().Nil(err2) if ev.Header.Timestamp == 0 || ev.Header.LogPos == 0 { if ev.Header.EventType == replication.ROTATE_EVENT { fakeRotateEventCount++ } continue // ignore fake event } - c.Assert(ev, check.DeepEquals, baseEvents[i]) + t.Require().Equal(baseEvents[i], ev) i++ if i >= len(baseEvents) { break } } - c.Assert(fakeRotateEventCount, check.Equals, 0) - t.verifyNoEventsInStreamer(c, s) + t.Require().Equal(0, fakeRotateEventCount) + t.verifyNoEventsInStreamer(s) } // generate another non-fake RotateEvent rotateEv, err := event.GenRotateEvent(baseEvents[0].Header, uint32(fileSize), []byte("mysql-bin.888888"), 4) - c.Assert(err, check.IsNil) + t.Require().NoError(err) _, err = f.Write(rotateEv.RawData) - c.Assert(err, check.IsNil) + t.Require().NoError(err) fileSize, _ = f.Seek(0, io.SeekCurrent) // latest is still the end_log_pos of the last event, not the next relay file log file's position @@ -249,15 +255,15 @@ func (t *testReaderSuite) TestParseFileBase(c *check.C) { cfg := &BinlogReaderConfig{RelayDir: baseDir, Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, true, currentUUID) t.setActiveRelayLog(r.relay, currentUUID, filename, fileSize) - state := t.createBinlogFileParseState(c, relayDir, filename, 4, possibleLast) + state := t.createBinlogFileParseState(relayDir, filename, 4, possibleLast) needSwitch, needReParse, err := r.parseFile(testCtx, s, true, state) - c.Assert(err, check.IsNil) - c.Assert(needSwitch, check.IsFalse) - c.Assert(needReParse, check.IsFalse) - c.Assert(state.latestPos, check.Equals, int64(rotateEv.Header.LogPos)) - c.Assert(state.formatDescEventRead, check.IsTrue) - c.Assert(state.skipGTID, check.Equals, false) - t.purgeStreamer(c, s) + t.Require().NoError(err) + t.Require().False(needSwitch) + t.Require().False(needReParse) + t.Require().Equal(int64(rotateEv.Header.LogPos), state.latestPos) + t.Require().True(state.formatDescEventRead) + t.Require().Equal(false, state.skipGTID) + t.purgeStreamer(s) } // parse from offset > 4 @@ -268,41 +274,41 @@ func (t *testReaderSuite) TestParseFileBase(c *check.C) { r := newBinlogReaderForTest(log.L(), cfg, true, currentUUID) t.setActiveRelayLog(r.relay, currentUUID, filename, fileSize) offset := int64(rotateEv.Header.LogPos - rotateEv.Header.EventSize) - state := t.createBinlogFileParseState(c, relayDir, filename, offset, possibleLast) + state := t.createBinlogFileParseState(relayDir, filename, offset, possibleLast) needSwitch, needReParse, err := r.parseFile(testCtx, s, false, state) - c.Assert(err, check.IsNil) - c.Assert(needSwitch, check.IsFalse) - c.Assert(needReParse, check.IsFalse) - c.Assert(state.latestPos, check.Equals, int64(rotateEv.Header.LogPos)) - c.Assert(state.formatDescEventRead, check.IsTrue) - c.Assert(state.skipGTID, check.Equals, false) + t.Require().NoError(err) + t.Require().False(needSwitch) + t.Require().False(needReParse) + t.Require().Equal(int64(rotateEv.Header.LogPos), state.latestPos) + t.Require().True(state.formatDescEventRead) + t.Require().Equal(false, state.skipGTID) // should only get a RotateEvent i := 0 for { ev, err2 := s.GetEvent(ctx) - c.Assert(err2, check.IsNil) + t.Require().Nil(err2) switch ev.Header.EventType { case replication.ROTATE_EVENT: - c.Assert(ev.RawData, check.DeepEquals, rotateEv.RawData) + t.Require().Equal(rotateEv.RawData, ev.RawData) i++ default: - c.Fatalf("got unexpected event %+v", ev.Header) + t.T().Fatalf("got unexpected event %+v", ev.Header) } if i >= 1 { break } } - t.verifyNoEventsInStreamer(c, s) + t.verifyNoEventsInStreamer(s) } } -func (t *testReaderSuite) TestParseFileRelayNeedSwitchSubDir(c *check.C) { +func (t *testReaderSuite) TestParseFileRelayNeedSwitchSubDir() { var ( filename = "test-mysql-bin.000001" nextFilename = "test-mysql-bin.666888" notUsedGTIDSetStr = t.lastGTID.String() - baseDir = c.MkDir() + baseDir = t.T().TempDir() offset int64 possibleLast = true currentUUID = "b60868af-5a6f-11e9-9ea3-0242ac160006.000001" @@ -318,49 +324,49 @@ func (t *testReaderSuite) TestParseFileRelayNeedSwitchSubDir(c *check.C) { // create the current relay log file and meta err := os.MkdirAll(relayDir, 0o700) - c.Assert(err, check.IsNil) + t.Require().NoError(err) f, err := os.OpenFile(fullPath, os.O_CREATE|os.O_WRONLY, 0o600) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer f.Close() _, err = f.Write(replication.BinLogFileHeader) offset = 4 - c.Assert(err, check.IsNil) - t.createMetaFile(c, relayDir, filename, uint32(offset), notUsedGTIDSetStr) + t.Require().NoError(err) + t.createMetaFile(relayDir, filename, uint32(offset), notUsedGTIDSetStr) r.subDirs = []string{currentUUID, switchedUUID} - t.writeUUIDs(c, baseDir, r.subDirs) + t.writeUUIDs(baseDir, r.subDirs) err = os.MkdirAll(nextRelayDir, 0o700) - c.Assert(err, check.IsNil) + t.Require().NoError(err) err = os.WriteFile(nextFullPath, replication.BinLogFileHeader, 0o600) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // has relay log file in next sub directory, need to switch ctx2, cancel2 := context.WithTimeout(context.Background(), parseFileTimeout) defer cancel2() - t.createMetaFile(c, nextRelayDir, filename, uint32(offset), notUsedGTIDSetStr) - state := t.createBinlogFileParseState(c, relayDir, filename, offset, possibleLast) + t.createMetaFile(nextRelayDir, filename, uint32(offset), notUsedGTIDSetStr) + state := t.createBinlogFileParseState(relayDir, filename, offset, possibleLast) state.formatDescEventRead = true t.setActiveRelayLog(r.relay, "next", "next", 4) needSwitch, needReParse, err := r.parseFile(ctx2, s, true, state) - c.Assert(err, check.IsNil) - c.Assert(needSwitch, check.IsTrue) - c.Assert(needReParse, check.IsFalse) - c.Assert(state.latestPos, check.Equals, int64(4)) - c.Assert(state.formatDescEventRead, check.IsTrue) - c.Assert(state.skipGTID, check.Equals, false) - t.purgeStreamer(c, s) + t.Require().NoError(err) + t.Require().True(needSwitch) + t.Require().False(needReParse) + t.Require().Equal(int64(4), state.latestPos) + t.Require().True(state.formatDescEventRead) + t.Require().Equal(false, state.skipGTID) + t.purgeStreamer(s) // NOTE: if we want to test the returned `needReParse` of `needSwitchSubDir`, // then we need to mock `fileSizeUpdated` or inject some delay or delay. } -func (t *testReaderSuite) TestParseFileRelayWithIgnorableError(c *check.C) { +func (t *testReaderSuite) TestParseFileRelayWithIgnorableError() { var ( filename = "test-mysql-bin.000001" notUsedGTIDSetStr = t.lastGTID.String() - baseDir = c.MkDir() + baseDir = t.T().TempDir() possibleLast = true - baseEvents, _, _ = t.genBinlogEvents(c, t.lastPos, t.lastGTID) + baseEvents, _, _ = t.genBinlogEvents(t.lastPos, t.lastGTID) currentUUID = "b60868af-5a6f-11e9-9ea3-0242ac160006.000001" relayDir = filepath.Join(baseDir, currentUUID) fullPath = filepath.Join(relayDir, filename) @@ -370,66 +376,66 @@ func (t *testReaderSuite) TestParseFileRelayWithIgnorableError(c *check.C) { // create the current relay log file and write some events err := os.MkdirAll(relayDir, 0o700) - c.Assert(err, check.IsNil) + t.Require().NoError(err) f, err := os.OpenFile(fullPath, os.O_CREATE|os.O_WRONLY, 0o600) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer f.Close() - t.createMetaFile(c, relayDir, filename, 0, notUsedGTIDSetStr) + t.createMetaFile(relayDir, filename, 0, notUsedGTIDSetStr) _, err = f.Write(replication.BinLogFileHeader) - c.Assert(err, check.IsNil) + t.Require().NoError(err) _, err = f.Write(baseEvents[0].RawData[:replication.EventHeaderSize]) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // meet io.EOF error when read event and ignore it. { r := newBinlogReaderForTest(log.L(), cfg, true, currentUUID) - state := t.createBinlogFileParseState(c, relayDir, filename, 4, possibleLast) + state := t.createBinlogFileParseState(relayDir, filename, 4, possibleLast) state.formatDescEventRead = true t.setActiveRelayLog(r.relay, currentUUID, filename, 100) needSwitch, needReParse, err := r.parseFile(context.Background(), s, true, state) - c.Assert(err, check.IsNil) - c.Assert(needSwitch, check.IsFalse) - c.Assert(needReParse, check.IsTrue) - c.Assert(state.latestPos, check.Equals, int64(4)) - c.Assert(state.formatDescEventRead, check.IsTrue) - c.Assert(state.skipGTID, check.Equals, false) + t.Require().NoError(err) + t.Require().False(needSwitch) + t.Require().True(needReParse) + t.Require().Equal(int64(4), state.latestPos) + t.Require().True(state.formatDescEventRead) + t.Require().Equal(false, state.skipGTID) } } -func (t *testReaderSuite) TestUpdateUUIDs(c *check.C) { +func (t *testReaderSuite) TestUpdateUUIDs() { var ( - baseDir = c.MkDir() + baseDir = t.T().TempDir() cfg = &BinlogReaderConfig{RelayDir: baseDir, Flavor: gmysql.MySQLFlavor} r = newBinlogReaderForTest(log.L(), cfg, true, "") ) - c.Assert(r.subDirs, check.HasLen, 0) + t.Require().Len(r.subDirs, 0) // index file not exists, got nothing err := r.updateSubDirs() - c.Assert(err, check.IsNil) - c.Assert(r.subDirs, check.HasLen, 0) + t.Require().NoError(err) + t.Require().Len(r.subDirs, 0) // valid UUIDs in the index file, got them back UUIDs := []string{ "b60868af-5a6f-11e9-9ea3-0242ac160006.000001", "b60868af-5a6f-11e9-9ea3-0242ac160007.000002", } - uuidBytes := t.uuidListToBytes(c, UUIDs) + uuidBytes := t.uuidListToBytes(UUIDs) err = os.WriteFile(r.indexPath, uuidBytes, 0o600) - c.Assert(err, check.IsNil) + t.Require().NoError(err) err = r.updateSubDirs() - c.Assert(err, check.IsNil) - c.Assert(r.subDirs, check.DeepEquals, UUIDs) + t.Require().NoError(err) + t.Require().Equal(UUIDs, r.subDirs) } -func (t *testReaderSuite) TestStartSyncByPos(c *check.C) { +func (t *testReaderSuite) TestStartSyncByPos() { var ( filenamePrefix = "test-mysql-bin.00000" notUsedGTIDSetStr = t.lastGTID.String() - baseDir = c.MkDir() - baseEvents, lastPos, lastGTID = t.genBinlogEvents(c, t.lastPos, t.lastGTID) + baseDir = t.T().TempDir() + baseEvents, lastPos, lastGTID = t.genBinlogEvents(t.lastPos, t.lastGTID) eventsBuf bytes.Buffer UUIDs = []string{ "b60868af-5a6f-11e9-9ea3-0242ac160006.000001", @@ -443,22 +449,22 @@ func (t *testReaderSuite) TestStartSyncByPos(c *check.C) { // prepare binlog data _, err := eventsBuf.Write(replication.BinLogFileHeader) - c.Assert(err, check.IsNil) + t.Require().NoError(err) for _, ev := range baseEvents { _, err = eventsBuf.Write(ev.RawData) - c.Assert(err, check.IsNil) + t.Require().NoError(err) } // create the index file - uuidBytes := t.uuidListToBytes(c, UUIDs) + uuidBytes := t.uuidListToBytes(UUIDs) err = os.WriteFile(r.indexPath, uuidBytes, 0o600) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // create sub directories for _, uuid := range UUIDs { subDir := filepath.Join(baseDir, uuid) err = os.MkdirAll(subDir, 0o700) - c.Assert(err, check.IsNil) + t.Require().NoError(err) } // 1. generate relay log files @@ -472,42 +478,42 @@ func (t *testReaderSuite) TestStartSyncByPos(c *check.C) { // don't add rotate event for the last file because we'll append more events to it. if !(i == 2 && j == i+1) { rotateEvent, err2 := event.GenRotateEvent(baseEvents[0].Header, lastPos, []byte(filenamePrefix+strconv.Itoa(j+1)), 4) - c.Assert(err2, check.IsNil) + t.Require().Nil(err2) content = append(content, rotateEvent.RawData...) } err = os.WriteFile(filename, content, 0o600) - c.Assert(err, check.IsNil) + t.Require().NoError(err) } - t.createMetaFile(c, path.Join(baseDir, UUIDs[i]), filenamePrefix+strconv.Itoa(i+1), + t.createMetaFile(path.Join(baseDir, UUIDs[i]), filenamePrefix+strconv.Itoa(i+1), startPos.Pos, notUsedGTIDSetStr) } // start the reader s, err := r.StartSyncByPos(startPos) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // get events from the streamer ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() - obtainBaseEvents := readNEvents(ctx, c, s, (1+2+3)*(len(baseEvents)+1)-1, false) - t.verifyNoEventsInStreamer(c, s) + obtainBaseEvents := readNEvents(ctx, t.T(), s, (1+2+3)*(len(baseEvents)+1)-1, false) + t.verifyNoEventsInStreamer(s) // verify obtain base events for i := 0; i < len(obtainBaseEvents); i += len(baseEvents) { - c.Assert(obtainBaseEvents[i:i+len(baseEvents)], check.DeepEquals, baseEvents) + t.Require().Equal(baseEvents, obtainBaseEvents[i:i+len(baseEvents)]) // skip rotate event which is not added in baseEvents i++ } // 2. write more events to the last file lastFilename := filepath.Join(baseDir, UUIDs[2], filenamePrefix+strconv.Itoa(3)) - extraEvents, _, _ := t.genBinlogEvents(c, lastPos, lastGTID) + extraEvents, _, _ := t.genBinlogEvents(lastPos, lastGTID) lastF, err := os.OpenFile(lastFilename, os.O_WRONLY|os.O_APPEND, 0o600) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer lastF.Close() for _, ev := range extraEvents { _, err = lastF.Write(ev.RawData) - c.Assert(err, check.IsNil) + t.Require().NoError(err) } r.notifyCh <- struct{}{} @@ -515,7 +521,7 @@ func (t *testReaderSuite) TestStartSyncByPos(c *check.C) { obtainExtraEvents := make([]*replication.BinlogEvent, 0, len(extraEvents)) for { ev, err2 := s.GetEvent(ctx) - c.Assert(err2, check.IsNil) + t.Require().Nil(err2) if ev.Header.Timestamp == 0 || ev.Header.LogPos == 0 || ev.Header.EventType == replication.FORMAT_DESCRIPTION_EVENT { continue // ignore fake event and FormatDescriptionEvent, go-mysql may send extra FormatDescriptionEvent } @@ -524,22 +530,22 @@ func (t *testReaderSuite) TestStartSyncByPos(c *check.C) { break } } - t.verifyNoEventsInStreamer(c, s) + t.verifyNoEventsInStreamer(s) // verify obtain extra events - c.Assert(obtainExtraEvents, check.DeepEquals, extraEvents) + t.Require().Equal(extraEvents, obtainExtraEvents) // 3. create new file in the last directory lastFilename = filepath.Join(baseDir, UUIDs[2], filenamePrefix+strconv.Itoa(4)) err = os.WriteFile(lastFilename, eventsBuf.Bytes(), 0o600) - c.Assert(err, check.IsNil) - t.createMetaFile(c, path.Join(baseDir, UUIDs[2]), lastFilename, lastPos, notUsedGTIDSetStr) + t.Require().NoError(err) + t.createMetaFile(path.Join(baseDir, UUIDs[2]), lastFilename, lastPos, notUsedGTIDSetStr) r.notifyCh <- struct{}{} obtainExtraEvents2 := make([]*replication.BinlogEvent, 0, len(baseEvents)-1) for { ev, err2 := s.GetEvent(ctx) - c.Assert(err2, check.IsNil) + t.Require().Nil(err2) if ev.Header.Timestamp == 0 || ev.Header.LogPos == 0 || ev.Header.EventType == replication.FORMAT_DESCRIPTION_EVENT { continue // ignore fake event and FormatDescriptionEvent, go-mysql may send extra FormatDescriptionEvent } @@ -548,10 +554,10 @@ func (t *testReaderSuite) TestStartSyncByPos(c *check.C) { break } } - t.verifyNoEventsInStreamer(c, s) + t.verifyNoEventsInStreamer(s) // verify obtain extra events - c.Assert(obtainExtraEvents2, check.DeepEquals, baseEvents[1:]) + t.Require().Equal(baseEvents[1:], obtainExtraEvents2) // NOTE: load new UUIDs dynamically not supported yet @@ -559,17 +565,17 @@ func (t *testReaderSuite) TestStartSyncByPos(c *check.C) { r.Close() } -func readNEvents(ctx context.Context, c *check.C, s reader.Streamer, l int, tolerateMayDup bool) []*replication.BinlogEvent { +func readNEvents(ctx context.Context, t *testing.T, s reader.Streamer, l int, tolerateMayDup bool) []*replication.BinlogEvent { var result []*replication.BinlogEvent for { ev, err2 := s.GetEvent(ctx) if tolerateMayDup { if err2 != nil { - c.Assert(errors.ErrorEqual(ErrorMaybeDuplicateEvent, err2), check.IsTrue) + require.True(t, errors.ErrorEqual(ErrorMaybeDuplicateEvent, err2)) continue } } else { - c.Assert(err2, check.IsNil) + require.NoError(t, err2) } if ev.Header.Timestamp == 0 && ev.Header.LogPos == 0 { continue // ignore fake event @@ -583,9 +589,9 @@ func readNEvents(ctx context.Context, c *check.C, s reader.Streamer, l int, tole return result } -func (t *testReaderSuite) TestStartSyncByGTID(c *check.C) { +func (t *testReaderSuite) TestStartSyncByGTID() { var ( - baseDir = c.MkDir() + baseDir = t.T().TempDir() events []*replication.BinlogEvent cfg = &BinlogReaderConfig{RelayDir: baseDir, Flavor: gmysql.MySQLFlavor} r = newBinlogReaderForTest(log.L(), cfg, false, "") @@ -706,9 +712,9 @@ func (t *testReaderSuite) TestStartSyncByGTID(c *check.C) { } // write index file - uuidBytes := t.uuidListToBytes(c, r.subDirs) + uuidBytes := t.uuidListToBytes(r.subDirs) err := os.WriteFile(r.indexPath, uuidBytes, 0o600) - c.Assert(err, check.IsNil) + t.Require().NoError(err) var allEvents []*replication.BinlogEvent var allResults []string @@ -718,10 +724,10 @@ func (t *testReaderSuite) TestStartSyncByGTID(c *check.C) { for i, subDir := range testCase { lastPos = 4 lastGTID, err = gtid.ParserGTID(gmysql.MySQLFlavor, subDir.gtidStr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) uuidDir := path.Join(baseDir, subDir.uuid) err = os.MkdirAll(uuidDir, 0o700) - c.Assert(err, check.IsNil) + t.Require().NoError(err) for _, fileEventResult := range subDir.fileEventResult { eventTypes := []replication.EventType{} @@ -733,20 +739,20 @@ func (t *testReaderSuite) TestStartSyncByGTID(c *check.C) { } // generate events - events, lastPos, lastGTID, previousGset = t.genEvents(c, eventTypes, lastPos, lastGTID, previousGset) + events, lastPos, lastGTID, previousGset = t.genEvents(eventTypes, lastPos, lastGTID, previousGset) allEvents = append(allEvents, events...) // write binlog file f, err2 := os.OpenFile(path.Join(uuidDir, fileEventResult.filename), os.O_CREATE|os.O_WRONLY, 0o600) - c.Assert(err2, check.IsNil) + t.Require().Nil(err2) _, err = f.Write(replication.BinLogFileHeader) - c.Assert(err, check.IsNil) + t.Require().NoError(err) for _, ev := range events { _, err = f.Write(ev.RawData) - c.Assert(err, check.IsNil) + t.Require().NoError(err) } f.Close() - t.createMetaFile(c, uuidDir, fileEventResult.filename, lastPos, previousGset.String()) + t.createMetaFile(uuidDir, fileEventResult.filename, lastPos, previousGset.String()) } if i == 0 { eventsNumOfFirstServer = len(allEvents) @@ -754,30 +760,30 @@ func (t *testReaderSuite) TestStartSyncByGTID(c *check.C) { } startGTID, err := gtid.ParserGTID(gmysql.MySQLFlavor, "") - c.Assert(err, check.IsNil) + t.Require().NoError(err) s, err := r.StartSyncByGTID(startGTID.Clone()) - c.Assert(err, check.IsNil) + t.Require().NoError(err) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - obtainBaseEvents := readNEvents(ctx, c, s, len(allEvents), true) + obtainBaseEvents := readNEvents(ctx, t.T(), s, len(allEvents), true) preGset, err := gmysql.ParseGTIDSet(gmysql.MySQLFlavor, "") - c.Assert(err, check.IsNil) + t.Require().NoError(err) gtidEventCount := 0 for i, ev := range obtainBaseEvents { - c.Assert(ev.Header, check.DeepEquals, allEvents[i].Header) + t.Require().Equal(allEvents[i].Header, ev.Header) if _, ok := ev.Event.(*replication.GTIDEvent); ok { gtidStr, _ := event.GetGTIDStr(ev) - c.Assert(preGset.Update(gtidStr), check.IsNil) + t.Require().NoError(preGset.Update(gtidStr)) // get pos by preGset pos, err2 := r.getPosByGTID(preGset.Clone()) - c.Assert(err2, check.IsNil) + t.Require().Nil(err2) // check result - c.Assert(pos.Name, check.Equals, allResults[gtidEventCount]) - c.Assert(pos.Pos, check.Equals, uint32(4)) + t.Require().Equal(allResults[gtidEventCount], pos.Name) + t.Require().Equal(uint32(4), pos.Pos) gtidEventCount++ } } @@ -796,66 +802,67 @@ func (t *testReaderSuite) TestStartSyncByGTID(c *check.C) { } excludeStr := strings.Join(excludeStrs, ",") excludeGset, err := gmysql.ParseGTIDSet(gmysql.MySQLFlavor, excludeStr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // StartSyncByGtid exclude first uuid s, err = r.StartSyncByGTID(excludeGset) - c.Assert(err, check.IsNil) - obtainBaseEvents = readNEvents(ctx, c, s, eventsNumOfFirstServer, true) + t.Require().NoError(err) + obtainBaseEvents = readNEvents(ctx, t.T(), s, eventsNumOfFirstServer, true) gset := excludeGset.Clone() // should not receive any event not from first server for i, event := range obtainBaseEvents { switch event.Header.EventType { case replication.HEARTBEAT_EVENT: - c.FailNow() + t.T().FailNow() case replication.GTID_EVENT: // check gtid event comes from first uuid subdir ev, _ := event.Event.(*replication.GTIDEvent) u, _ := uuid.FromBytes(ev.SID) - c.Assert(u.String(), check.Equals, includeServerUUID) - c.Assert(event.Header, check.DeepEquals, allEvents[i].Header) - c.Assert(gset.Update(fmt.Sprintf("%s:%d", u.String(), ev.GNO)), check.IsNil) + t.Require().Equal(includeServerUUID, u.String()) + t.Require().Equal(allEvents[i].Header, event.Header) + t.Require().NoError(gset.Update(fmt.Sprintf("%s:%d", u.String(), ev.GNO))) default: - c.Assert(event.Header, check.DeepEquals, allEvents[i].Header) + t.Require().Equal(allEvents[i].Header, event.Header) } } // gset same as preGset now - c.Assert(gset.Equal(preGset), check.IsTrue) + t.Require().True(gset.Equal(preGset)) // purge first uuid subdir's first binlog file - c.Assert(os.Remove(path.Join(baseDir, includeUUID, "mysql.000001")), check.IsNil) + t.Require().Nil(os.Remove(path.Join(baseDir, includeUUID, "mysql.000001"))) r.Close() r = newBinlogReaderForTest(log.L(), cfg, true, "") _, err = r.StartSyncByGTID(preGset) - c.Assert(err, check.IsNil) + t.Require().NoError(err) r.Close() r = newBinlogReaderForTest(log.L(), cfg, true, "") _, err = r.StartSyncByGTID(excludeGset) // error because file has been purge - c.Assert(terror.ErrNoRelayPosMatchGTID.Equal(err), check.IsTrue) + t.Require().True(terror.ErrNoRelayPosMatchGTID.Equal(err)) // purge first uuid subdir - c.Assert(os.RemoveAll(path.Join(baseDir, includeUUID)), check.IsNil) + t.Require().Nil(os.RemoveAll(path.Join(baseDir, includeUUID))) r.Close() r = newBinlogReaderForTest(log.L(), cfg, true, "") _, err = r.StartSyncByGTID(preGset) - c.Assert(err, check.IsNil) + t.Require().NoError(err) r.Close() r = newBinlogReaderForTest(log.L(), cfg, true, "") _, err = r.StartSyncByGTID(excludeGset) // error because subdir has been purge - c.Assert(err, check.ErrorMatches, ".*no such file or directory.*") + t.Require().Error(err) + t.Require().Regexp(".*no such file or directory.*", err.Error()) cancel() } -func (t *testReaderSuite) TestStartSyncError(c *check.C) { +func (t *testReaderSuite) TestStartSyncError() { var ( - baseDir = c.MkDir() + baseDir = t.T().TempDir() UUIDs = []string{ "b60868af-5a6f-11e9-9ea3-0242ac160006.000001", } @@ -865,67 +872,72 @@ func (t *testReaderSuite) TestStartSyncError(c *check.C) { r := newBinlogReaderForTest(log.L(), cfg, true, "") err := r.checkRelayPos(startPos) - c.Assert(err, check.ErrorMatches, ".*empty UUIDs not valid.*") + t.Require().Error(err) + t.Require().Regexp(".*empty UUIDs not valid.*", err.Error()) // no startup pos specified s, err := r.StartSyncByPos(gmysql.Position{}) - c.Assert(terror.ErrBinlogFileNotSpecified.Equal(err), check.IsTrue) - c.Assert(s, check.IsNil) + t.Require().True(terror.ErrBinlogFileNotSpecified.Equal(err)) + t.Require().Nil(s) // empty UUIDs s, err = r.StartSyncByPos(startPos) - c.Assert(err, check.ErrorMatches, ".*empty UUIDs not valid.*") - c.Assert(s, check.IsNil) + t.Require().Error(err) + t.Require().Regexp(".*empty UUIDs not valid.*", err.Error()) + t.Require().Nil(s) s, err = r.StartSyncByGTID(t.lastGTID.Clone()) - c.Assert(err, check.ErrorMatches, ".*no relay pos match gtid.*") - c.Assert(s, check.IsNil) + t.Require().Error(err) + t.Require().Regexp(".*no relay pos match gtid.*", err.Error()) + t.Require().Nil(s) // write UUIDs into index file r = newBinlogReaderForTest(log.L(), cfg, true, "") // create a new reader - uuidBytes := t.uuidListToBytes(c, UUIDs) + uuidBytes := t.uuidListToBytes(UUIDs) err = os.WriteFile(r.indexPath, uuidBytes, 0o600) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // the startup relay log file not found s, err = r.StartSyncByPos(startPos) - c.Assert(err, check.ErrorMatches, fmt.Sprintf(".*%s.*not found.*", startPos.Name)) - c.Assert(s, check.IsNil) + t.Require().Error(err) + t.Require().Regexp(fmt.Sprintf(".*%s.*not found.*", startPos.Name), err.Error()) + t.Require().Nil(s) s, err = r.StartSyncByGTID(t.lastGTID.Clone()) - c.Assert(err, check.ErrorMatches, ".*no such file or directory.*") - c.Assert(s, check.IsNil) + t.Require().Error(err) + t.Require().Regexp(".*no such file or directory.*", err.Error()) + t.Require().Nil(s) // can not re-start the reader r.running = true s, err = r.StartSyncByPos(startPos) - c.Assert(terror.ErrReaderAlreadyRunning.Equal(err), check.IsTrue) - c.Assert(s, check.IsNil) + t.Require().True(terror.ErrReaderAlreadyRunning.Equal(err)) + t.Require().Nil(s) r.Close() r.running = true s, err = r.StartSyncByGTID(t.lastGTID.Clone()) - c.Assert(terror.ErrReaderAlreadyRunning.Equal(err), check.IsTrue) - c.Assert(s, check.IsNil) + t.Require().True(terror.ErrReaderAlreadyRunning.Equal(err)) + t.Require().Nil(s) r.Close() // too big startPos uuid := UUIDs[0] err = os.MkdirAll(filepath.Join(baseDir, uuid), 0o700) - c.Assert(err, check.IsNil) + t.Require().NoError(err) parsedStartPosName := "test-mysql-bin.000001" relayLogFilePath := filepath.Join(baseDir, uuid, parsedStartPosName) err = os.WriteFile(relayLogFilePath, make([]byte, 100), 0o600) - c.Assert(err, check.IsNil) + t.Require().NoError(err) startPos.Pos = 10000 s, err = r.StartSyncByPos(startPos) - c.Assert(terror.ErrRelayLogGivenPosTooBig.Equal(err), check.IsTrue) - c.Assert(s, check.IsNil) + t.Require().True(terror.ErrRelayLogGivenPosTooBig.Equal(err)) + t.Require().Nil(s) } -func (t *testReaderSuite) TestAdvanceCurrentGTIDSet(c *check.C) { +func (t *testReaderSuite) TestAdvanceCurrentGTIDSet() { var ( - baseDir = c.MkDir() + baseDir = t.T().TempDir() cfg = &BinlogReaderConfig{RelayDir: baseDir, Flavor: gmysql.MySQLFlavor} r = newBinlogReaderForTest(log.L(), cfg, true, "") mysqlGset, _ = gmysql.ParseMysqlGTIDSet("b60868af-5a6f-11e9-9ea3-0242ac160006:1-6") @@ -934,32 +946,32 @@ func (t *testReaderSuite) TestAdvanceCurrentGTIDSet(c *check.C) { r.prevGset = mysqlGset.Clone() r.currGset = nil notUpdated, err := r.advanceCurrentGtidSet("b60868af-5a6f-11e9-9ea3-0242ac160006:6") - c.Assert(err, check.IsNil) - c.Assert(notUpdated, check.IsTrue) - c.Assert(mysqlGset.Equal(r.currGset), check.IsTrue) + t.Require().NoError(err) + t.Require().True(notUpdated) + t.Require().True(mysqlGset.Equal(r.currGset)) notUpdated, err = r.advanceCurrentGtidSet("b60868af-5a6f-11e9-9ea3-0242ac160006:7") - c.Assert(err, check.IsNil) - c.Assert(notUpdated, check.IsFalse) - c.Assert(mysqlGset.Equal(r.prevGset), check.IsTrue) - c.Assert(r.currGset.String(), check.Equals, "b60868af-5a6f-11e9-9ea3-0242ac160006:1-7") + t.Require().NoError(err) + t.Require().False(notUpdated) + t.Require().True(mysqlGset.Equal(r.prevGset)) + t.Require().Equal("b60868af-5a6f-11e9-9ea3-0242ac160006:1-7", r.currGset.String()) r.cfg.Flavor = gmysql.MariaDBFlavor r.prevGset = mariadbGset.Clone() r.currGset = nil notUpdated, err = r.advanceCurrentGtidSet("0-1-3") - c.Assert(err, check.IsNil) - c.Assert(notUpdated, check.IsTrue) - c.Assert(mariadbGset.Equal(r.currGset), check.IsTrue) + t.Require().NoError(err) + t.Require().True(notUpdated) + t.Require().True(mariadbGset.Equal(r.currGset)) notUpdated, err = r.advanceCurrentGtidSet("0-1-6") - c.Assert(err, check.IsNil) - c.Assert(notUpdated, check.IsFalse) - c.Assert(mariadbGset.Equal(r.prevGset), check.IsTrue) - c.Assert(r.currGset.String(), check.Equals, "0-1-6") + t.Require().NoError(err) + t.Require().False(notUpdated) + t.Require().True(mariadbGset.Equal(r.prevGset)) + t.Require().Equal("0-1-6", r.currGset.String()) } -func (t *testReaderSuite) TestReParseUsingGTID(c *check.C) { +func (t *testReaderSuite) TestReParseUsingGTID() { var ( - baseDir = c.MkDir() + baseDir = t.T().TempDir() cfg = &BinlogReaderConfig{RelayDir: baseDir, Flavor: gmysql.MySQLFlavor} r = newBinlogReaderForTest(log.L(), cfg, true, "") uuid = "ba8f633f-1f15-11eb-b1c7-0242ac110002.000001" @@ -969,25 +981,25 @@ func (t *testReaderSuite) TestReParseUsingGTID(c *check.C) { ) startGTID, err := gtid.ParserGTID(gmysql.MySQLFlavor, "") - c.Assert(err, check.IsNil) + t.Require().NoError(err) lastGTID, err := gtid.ParserGTID(gmysql.MySQLFlavor, gtidStr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // prepare a minimal relay log file - c.Assert(os.WriteFile(r.indexPath, []byte(uuid), 0o600), check.IsNil) + t.Require().Nil(os.WriteFile(r.indexPath, []byte(uuid), 0o600)) uuidDir := path.Join(baseDir, uuid) - c.Assert(os.MkdirAll(uuidDir, 0o700), check.IsNil) + t.Require().Nil(os.MkdirAll(uuidDir, 0o700)) f, err := os.OpenFile(path.Join(uuidDir, file), os.O_CREATE|os.O_WRONLY, 0o600) - c.Assert(err, check.IsNil) + t.Require().NoError(err) _, err = f.Write(replication.BinLogFileHeader) - c.Assert(err, check.IsNil) + t.Require().NoError(err) meta := LocalMeta{BinLogName: file, BinLogPos: latestPos, BinlogGTID: startGTID.String()} metaFile, err := os.Create(path.Join(uuidDir, utils.MetaFilename)) - c.Assert(err, check.IsNil) - c.Assert(toml.NewEncoder(metaFile).Encode(&meta), check.IsNil) - c.Assert(metaFile.Close(), check.IsNil) + t.Require().NoError(err) + t.Require().NoError(toml.NewEncoder(metaFile).Encode(&meta)) + t.Require().NoError(metaFile.Close()) // prepare some regular events, // FORMAT_DESC + PREVIOUS_GTIDS, some events generated from a DDL, some events generated from a DML @@ -996,18 +1008,18 @@ func (t *testReaderSuite) TestReParseUsingGTID(c *check.C) { replication.QUERY_EVENT, replication.XID_EVENT, } - events, _, _, latestGTIDSet := t.genEvents(c, genType, 4, lastGTID, startGTID) - c.Assert(events, check.HasLen, 1+1+2+5) + events, _, _, latestGTIDSet := t.genEvents(genType, 4, lastGTID, startGTID) + t.Require().Len(events, 1+1+2+5) // write FORMAT_DESC + PREVIOUS_GTIDS _, err = f.Write(events[0].RawData) - c.Assert(err, check.IsNil) + t.Require().NoError(err) _, err = f.Write(events[1].RawData) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // we use latestGTIDSet to start sync, which means we already received all binlog events, so expect no DML/DDL s, err := r.StartSyncByGTID(latestGTIDSet) - c.Assert(err, check.IsNil) + t.Require().NoError(err) var wg sync.WaitGroup wg.Add(1) @@ -1030,8 +1042,8 @@ func (t *testReaderSuite) TestReParseUsingGTID(c *check.C) { if err2 == context.Canceled { break } - c.Assert(err2, check.IsNil) - c.Assert(ev.Header.EventType, check.Equals, expected[ev.Header.LogPos]) + t.Require().Nil(err2) + t.Require().Equal(expected[ev.Header.LogPos], ev.Header.EventType) } wg.Done() }() @@ -1040,7 +1052,7 @@ func (t *testReaderSuite) TestReParseUsingGTID(c *check.C) { // hope a second is enough to trigger needReParse time.Sleep(time.Second) _, err = f.Write(events[i].RawData) - c.Assert(err, check.IsNil) + t.Require().NoError(err) _ = f.Sync() select { case r.notifyCh <- struct{}{}: @@ -1052,7 +1064,7 @@ func (t *testReaderSuite) TestReParseUsingGTID(c *check.C) { wg.Wait() } -func (t *testReaderSuite) genBinlogEvents(c *check.C, latestPos uint32, latestGTID gmysql.GTIDSet) ([]*replication.BinlogEvent, uint32, gmysql.GTIDSet) { +func (t *testReaderSuite) genBinlogEvents(latestPos uint32, latestGTID gmysql.GTIDSet) ([]*replication.BinlogEvent, uint32, gmysql.GTIDSet) { var ( header = &replication.EventHeader{ Timestamp: uint32(time.Now().Unix()), @@ -1063,7 +1075,7 @@ func (t *testReaderSuite) genBinlogEvents(c *check.C, latestPos uint32, latestGT if latestPos <= 4 { // generate a FormatDescriptionEvent if needed ev, err := event.GenFormatDescriptionEvent(header, 4) - c.Assert(err, check.IsNil) + t.Require().NoError(err) latestPos = ev.Header.LogPos events = append(events, ev) } @@ -1072,7 +1084,7 @@ func (t *testReaderSuite) genBinlogEvents(c *check.C, latestPos uint32, latestGT count := 5 + rand.Intn(5) for i := 0; i < count; i++ { evs, err := event.GenDDLEvents(gmysql.MySQLFlavor, 1, latestPos, latestGTID, fmt.Sprintf("db_%d", i), fmt.Sprintf("CREATE TABLE %d (c1 INT)", i), true, false, 0) - c.Assert(err, check.IsNil) + t.Require().NoError(err) events = append(events, evs.Events...) latestPos = evs.LatestPos latestGTID = evs.LatestGTID @@ -1082,7 +1094,6 @@ func (t *testReaderSuite) genBinlogEvents(c *check.C, latestPos uint32, latestGT } func (t *testReaderSuite) genEvents( - c *check.C, eventTypes []replication.EventType, latestPos uint32, latestGTID gmysql.GTIDSet, @@ -1100,7 +1111,7 @@ func (t *testReaderSuite) genEvents( if latestPos <= 4 { // generate a FormatDescriptionEvent if needed ev, err := event.GenFormatDescriptionEvent(header, 4) - c.Assert(err, check.IsNil) + t.Require().NoError(err) latestPos = ev.Header.LogPos events = append(events, ev) } @@ -1109,15 +1120,15 @@ func (t *testReaderSuite) genEvents( switch eventType { case replication.QUERY_EVENT: evs, err := event.GenDDLEvents(gmysql.MySQLFlavor, 1, latestPos, latestGTID, fmt.Sprintf("db_%d", i), fmt.Sprintf("CREATE TABLE %d (c1 int)", i), true, false, 0) - c.Assert(err, check.IsNil) + t.Require().NoError(err) events = append(events, evs.Events...) latestPos = evs.LatestPos latestGTID = evs.LatestGTID _, ok := evs.Events[0].Event.(*replication.GTIDEvent) - c.Assert(ok, check.IsTrue) + t.Require().True(ok) gtidStr, _ := event.GetGTIDStr(evs.Events[0]) err = originSet.Update(gtidStr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) case replication.XID_EVENT: insertDMLData := []*event.DMLData{ { @@ -1129,23 +1140,23 @@ func (t *testReaderSuite) genEvents( }, } evs, err := event.GenDMLEvents(gmysql.MySQLFlavor, 1, latestPos, latestGTID, replication.WRITE_ROWS_EVENTv2, 10, insertDMLData, true, false, 0) - c.Assert(err, check.IsNil) + t.Require().NoError(err) events = append(events, evs.Events...) latestPos = evs.LatestPos latestGTID = evs.LatestGTID _, ok := evs.Events[0].Event.(*replication.GTIDEvent) - c.Assert(ok, check.IsTrue) + t.Require().True(ok) gtidStr, _ := event.GetGTIDStr(evs.Events[0]) err = originSet.Update(gtidStr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) case replication.ROTATE_EVENT: ev, err := event.GenRotateEvent(header, latestPos, []byte("next_log"), 4) - c.Assert(err, check.IsNil) + t.Require().NoError(err) events = append(events, ev) latestPos = 4 case replication.PREVIOUS_GTIDS_EVENT: ev, err := event.GenPreviousGTIDsEvent(header, latestPos, pGset) - c.Assert(err, check.IsNil) + t.Require().NoError(err) events = append(events, ev) latestPos = ev.Header.LogPos } @@ -1153,7 +1164,7 @@ func (t *testReaderSuite) genEvents( return events, latestPos, latestGTID, originSet } -func (t *testReaderSuite) purgeStreamer(c *check.C, s reader.Streamer) { +func (t *testReaderSuite) purgeStreamer(s reader.Streamer) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond) defer cancel() @@ -1165,55 +1176,55 @@ func (t *testReaderSuite) purgeStreamer(c *check.C, s reader.Streamer) { case err == ctx.Err(): return default: - c.Fatalf("purge streamer with error %v", err) + t.T().Fatalf("purge streamer with error %v", err) } } } -func (t *testReaderSuite) verifyNoEventsInStreamer(c *check.C, s reader.Streamer) { +func (t *testReaderSuite) verifyNoEventsInStreamer(s reader.Streamer) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond) defer cancel() ev, err := s.GetEvent(ctx) if err != ctx.Err() { - c.Fatalf("got event %v with error %v from streamer", ev, err) + t.T().Fatalf("got event %v with error %v from streamer", ev, err) } } -func (t *testReaderSuite) uuidListToBytes(c *check.C, uuids []string) []byte { +func (t *testReaderSuite) uuidListToBytes(uuids []string) []byte { var buf bytes.Buffer for _, uuid := range uuids { _, err := buf.WriteString(uuid) - c.Assert(err, check.IsNil) + t.Require().NoError(err) _, err = buf.WriteString("\n") - c.Assert(err, check.IsNil) + t.Require().NoError(err) } return buf.Bytes() } // nolint:unparam -func (t *testReaderSuite) writeUUIDs(c *check.C, relayDir string, uuids []string) []byte { +func (t *testReaderSuite) writeUUIDs(relayDir string, uuids []string) []byte { indexPath := path.Join(relayDir, utils.UUIDIndexFilename) var buf bytes.Buffer for _, uuid := range uuids { _, err := buf.WriteString(uuid) - c.Assert(err, check.IsNil) + t.Require().NoError(err) _, err = buf.WriteString("\n") - c.Assert(err, check.IsNil) + t.Require().NoError(err) } // write the index file err := os.WriteFile(indexPath, buf.Bytes(), 0o600) - c.Assert(err, check.IsNil) + t.Require().NoError(err) return buf.Bytes() } -func (t *testReaderSuite) createMetaFile(c *check.C, relayDirPath, binlogFileName string, pos uint32, gtid string) { +func (t *testReaderSuite) createMetaFile(relayDirPath, binlogFileName string, pos uint32, gtid string) { meta := LocalMeta{BinLogName: binlogFileName, BinLogPos: pos, BinlogGTID: gtid} metaFile, err2 := os.Create(path.Join(relayDirPath, utils.MetaFilename)) - c.Assert(err2, check.IsNil) + t.Require().Nil(err2) err := toml.NewEncoder(metaFile).Encode(&meta) - c.Assert(err, check.IsNil) + t.Require().NoError(err) metaFile.Close() } @@ -1249,7 +1260,7 @@ func (m *mockFileWriterForActiveTest) IsActive(uuid, filename string) (bool, int return v.active, v.offset } -func (t *testReaderSuite) TestwaitBinlogChanged(c *check.C) { +func (t *testReaderSuite) TestwaitBinlogChanged() { var ( relayFiles = []string{ "mysql-bin.000001", @@ -1263,7 +1274,7 @@ func (t *testReaderSuite) TestwaitBinlogChanged(c *check.C) { ) // create relay log dir - subDir := c.MkDir() + subDir := t.T().TempDir() // join the file path for i, rf := range relayFiles { relayPaths[i] = filepath.Join(subDir, rf) @@ -1274,9 +1285,9 @@ func (t *testReaderSuite) TestwaitBinlogChanged(c *check.C) { rotateRelayFile := func(filename string) { meta := LocalMeta{BinLogName: filename, BinLogPos: binlogPos, BinlogGTID: binlogGTID} metaFile, err2 := os.Create(path.Join(subDir, utils.MetaFilename)) - c.Assert(err2, check.IsNil) + t.Require().Nil(err2) err := toml.NewEncoder(metaFile).Encode(&meta) - c.Assert(err, check.IsNil) + t.Require().NoError(err) _ = metaFile.Close() } @@ -1285,12 +1296,13 @@ func (t *testReaderSuite) TestwaitBinlogChanged(c *check.C) { cfg := &BinlogReaderConfig{RelayDir: "", Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, false, "") t.setActiveRelayLog(r.relay, "next", "next", 0) - state := t.createBinlogFileParseState(c, subDir, relayFiles[0], 0, true) + state := t.createBinlogFileParseState(subDir, relayFiles[0], 0, true) needSwitch, reParse, err := r.waitBinlogChanged(context.Background(), state) - c.Assert(needSwitch, check.IsFalse) - c.Assert(reParse, check.IsFalse) - c.Assert(err, check.NotNil) - c.Assert(err, check.ErrorMatches, ".*no such file or directory*") + t.Require().False(needSwitch) + t.Require().False(reParse) + t.Require().Error(err) + t.Require().Error(err) + t.Require().Regexp(".*no such file or directory*", err.Error()) } // write meta @@ -1306,15 +1318,16 @@ func (t *testReaderSuite) TestwaitBinlogChanged(c *check.C) { relayLogFile: "not-exist-file", } needSwitch, reParse, err := r.waitBinlogChanged(context.Background(), state) - c.Assert(needSwitch, check.IsFalse) - c.Assert(reParse, check.IsFalse) - c.Assert(err, check.NotNil) - c.Assert(err, check.ErrorMatches, ".*no such file or directory*") + t.Require().False(needSwitch) + t.Require().False(reParse) + t.Require().Error(err) + t.Require().Error(err) + t.Require().Regexp(".*no such file or directory*", err.Error()) } // create the first relay file err1 := os.WriteFile(relayPaths[0], data, 0o600) - c.Assert(err1, check.IsNil) + t.Require().Nil(err1) // rotate relay file rotateRelayFile(relayFiles[1]) @@ -1323,12 +1336,12 @@ func (t *testReaderSuite) TestwaitBinlogChanged(c *check.C) { cfg := &BinlogReaderConfig{RelayDir: "", Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, false, "") t.setActiveRelayLog(r.relay, "next", "next", 0) - state := t.createBinlogFileParseState(c, subDir, relayFiles[0], size+100, true) + state := t.createBinlogFileParseState(subDir, relayFiles[0], size+100, true) needSwitch, reParse, err := r.waitBinlogChanged(context.Background(), state) - c.Assert(needSwitch, check.IsFalse) - c.Assert(reParse, check.IsFalse) - c.Assert(err, check.NotNil) - c.Assert(terror.ErrRelayLogFileSizeSmaller.Equal(err), check.IsTrue) + t.Require().False(needSwitch) + t.Require().False(reParse) + t.Require().Error(err) + t.Require().True(terror.ErrRelayLogFileSizeSmaller.Equal(err)) } // return changed file in meta @@ -1336,11 +1349,11 @@ func (t *testReaderSuite) TestwaitBinlogChanged(c *check.C) { cfg := &BinlogReaderConfig{RelayDir: "", Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, false, "") t.setActiveRelayLog(r.relay, "next", "next", 0) - state := t.createBinlogFileParseState(c, subDir, relayFiles[0], size, true) + state := t.createBinlogFileParseState(subDir, relayFiles[0], size, true) needSwitch, reParse, err := r.waitBinlogChanged(context.Background(), state) - c.Assert(needSwitch, check.IsFalse) - c.Assert(reParse, check.IsFalse) - c.Assert(err, check.IsNil) + t.Require().False(needSwitch) + t.Require().False(reParse) + t.Require().NoError(err) } // file increased when checking meta @@ -1348,11 +1361,11 @@ func (t *testReaderSuite) TestwaitBinlogChanged(c *check.C) { cfg := &BinlogReaderConfig{RelayDir: "", Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, false, "") t.setActiveRelayLog(r.relay, "next", "next", 0) - state := t.createBinlogFileParseState(c, subDir, relayFiles[0], 0, true) + state := t.createBinlogFileParseState(subDir, relayFiles[0], 0, true) needSwitch, reParse, err := r.waitBinlogChanged(context.Background(), state) - c.Assert(needSwitch, check.IsFalse) - c.Assert(reParse, check.IsTrue) - c.Assert(err, check.IsNil) + t.Require().False(needSwitch) + t.Require().True(reParse) + t.Require().NoError(err) } // context timeout (no new write) @@ -1362,30 +1375,30 @@ func (t *testReaderSuite) TestwaitBinlogChanged(c *check.C) { cfg := &BinlogReaderConfig{RelayDir: "", Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, false, "current-uuid") // no notify t.setActiveRelayLog(r.relay, "current-uuid", relayFiles[0], 0) - state := t.createBinlogFileParseState(c, subDir, relayFiles[0], 0, true) + state := t.createBinlogFileParseState(subDir, relayFiles[0], 0, true) needSwitch, reParse, err := r.waitBinlogChanged(newCtx, state) - c.Assert(needSwitch, check.IsFalse) - c.Assert(reParse, check.IsFalse) - c.Assert(err, check.IsNil) + t.Require().False(needSwitch) + t.Require().False(reParse) + t.Require().NoError(err) } // this dir is different from the dir of current binlog file, but for test it doesn't matter - relayDir := c.MkDir() - t.writeUUIDs(c, relayDir, []string{"xxx.000001", "invalid uuid"}) + relayDir := t.T().TempDir() + t.writeUUIDs(relayDir, []string{"xxx.000001", "invalid uuid"}) // getSwitchPath return error(invalid uuid file) { cfg := &BinlogReaderConfig{RelayDir: relayDir, Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, false, "xxx.000001") t.setActiveRelayLog(r.relay, "next", "next", 0) - state := t.createBinlogFileParseState(c, subDir, relayFiles[1], 0, true) + state := t.createBinlogFileParseState(subDir, relayFiles[1], 0, true) needSwitch, reParse, err := r.waitBinlogChanged(context.Background(), state) - c.Assert(needSwitch, check.IsFalse) - c.Assert(reParse, check.IsFalse) - c.Assert(terror.ErrRelayParseUUIDSuffix.Equal(err), check.IsTrue) + t.Require().False(needSwitch) + t.Require().False(reParse) + t.Require().True(terror.ErrRelayParseUUIDSuffix.Equal(err)) } - t.writeUUIDs(c, relayDir, []string{"xxx.000001", "xxx.000002"}) + t.writeUUIDs(relayDir, []string{"xxx.000001", "xxx.000002"}) _ = os.MkdirAll(filepath.Join(relayDir, "xxx.000002"), 0o700) _ = os.WriteFile(filepath.Join(relayDir, "xxx.000002", "mysql.000001"), nil, 0o600) @@ -1395,42 +1408,42 @@ func (t *testReaderSuite) TestwaitBinlogChanged(c *check.C) { cfg := &BinlogReaderConfig{RelayDir: relayDir, Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, false, "xxx.000001") t.setActiveRelayLog(r.relay, "next", "next", 0) - state := t.createBinlogFileParseState(c, subDir, relayFiles[1], 0, true) + state := t.createBinlogFileParseState(subDir, relayFiles[1], 0, true) _ = os.Remove(relayPaths[1]) needSwitch, reParse, err := r.waitBinlogChanged(context.Background(), state) - c.Assert(needSwitch, check.IsFalse) - c.Assert(reParse, check.IsFalse) - c.Assert(terror.ErrGetRelayLogStat.Equal(err), check.IsTrue) + t.Require().False(needSwitch) + t.Require().False(reParse) + t.Require().True(terror.ErrGetRelayLogStat.Equal(err)) } err1 = os.WriteFile(relayPaths[1], nil, 0o600) - c.Assert(err1, check.IsNil) + t.Require().Nil(err1) // binlog dir switched, but last file smaller { cfg := &BinlogReaderConfig{RelayDir: relayDir, Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, false, "xxx.000001") t.setActiveRelayLog(r.relay, "next", "next", 0) - state := t.createBinlogFileParseState(c, subDir, relayFiles[1], size, true) + state := t.createBinlogFileParseState(subDir, relayFiles[1], size, true) needSwitch, reParse, err := r.waitBinlogChanged(context.Background(), state) - c.Assert(needSwitch, check.IsFalse) - c.Assert(reParse, check.IsFalse) - c.Assert(terror.ErrRelayLogFileSizeSmaller.Equal(err), check.IsTrue) + t.Require().False(needSwitch) + t.Require().False(reParse) + t.Require().True(terror.ErrRelayLogFileSizeSmaller.Equal(err)) } err1 = os.WriteFile(relayPaths[1], data, 0o600) - c.Assert(err1, check.IsNil) + t.Require().Nil(err1) // binlog dir switched, but last file bigger { cfg := &BinlogReaderConfig{RelayDir: relayDir, Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, false, "xxx.000001") t.setActiveRelayLog(r.relay, "next", "next", 0) - state := t.createBinlogFileParseState(c, subDir, relayFiles[1], 0, true) + state := t.createBinlogFileParseState(subDir, relayFiles[1], 0, true) needSwitch, reParse, err := r.waitBinlogChanged(context.Background(), state) - c.Assert(needSwitch, check.IsFalse) - c.Assert(reParse, check.IsTrue) - c.Assert(err, check.IsNil) + t.Require().False(needSwitch) + t.Require().True(reParse) + t.Require().NoError(err) } // binlog dir switched, but last file not changed @@ -1438,11 +1451,11 @@ func (t *testReaderSuite) TestwaitBinlogChanged(c *check.C) { cfg := &BinlogReaderConfig{RelayDir: relayDir, Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, false, "xxx.000001") t.setActiveRelayLog(r.relay, "next", "next", 0) - state := t.createBinlogFileParseState(c, subDir, relayFiles[1], size, true) + state := t.createBinlogFileParseState(subDir, relayFiles[1], size, true) needSwitch, reParse, err := r.waitBinlogChanged(context.Background(), state) - c.Assert(needSwitch, check.IsTrue) - c.Assert(reParse, check.IsFalse) - c.Assert(err, check.IsNil) + t.Require().True(needSwitch) + t.Require().False(reParse) + t.Require().NoError(err) } // got notified and active pos > current read pos @@ -1450,11 +1463,11 @@ func (t *testReaderSuite) TestwaitBinlogChanged(c *check.C) { cfg := &BinlogReaderConfig{RelayDir: relayDir, Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, true, "xxx.000001") t.setActiveRelayLog(r.relay, r.currentSubDir, relayFiles[1], size) - state := t.createBinlogFileParseState(c, subDir, relayFiles[1], 0, true) + state := t.createBinlogFileParseState(subDir, relayFiles[1], 0, true) needSwitch, reParse, err := r.waitBinlogChanged(context.Background(), state) - c.Assert(needSwitch, check.IsFalse) - c.Assert(reParse, check.IsTrue) - c.Assert(err, check.IsNil) + t.Require().False(needSwitch) + t.Require().True(reParse) + t.Require().NoError(err) } // got notified but not active @@ -1466,11 +1479,11 @@ func (t *testReaderSuite) TestwaitBinlogChanged(c *check.C) { {true, 0}, {false, 0}, }} - state := t.createBinlogFileParseState(c, subDir, relayFiles[1], 0, true) + state := t.createBinlogFileParseState(subDir, relayFiles[1], 0, true) needSwitch, reParse, err := r.waitBinlogChanged(context.Background(), state) - c.Assert(needSwitch, check.IsFalse) - c.Assert(reParse, check.IsTrue) - c.Assert(err, check.IsNil) + t.Require().False(needSwitch) + t.Require().True(reParse) + t.Require().NoError(err) } // got notified, first notified is active but has already read to that offset @@ -1487,17 +1500,17 @@ func (t *testReaderSuite) TestwaitBinlogChanged(c *check.C) { {true, 0}, {true, size}, }} - state := t.createBinlogFileParseState(c, subDir, relayFiles[1], 0, true) + state := t.createBinlogFileParseState(subDir, relayFiles[1], 0, true) needSwitch, reParse, err := r.waitBinlogChanged(context.Background(), state) - c.Assert(needSwitch, check.IsFalse) - c.Assert(reParse, check.IsTrue) - c.Assert(err, check.IsNil) + t.Require().False(needSwitch) + t.Require().True(reParse) + t.Require().NoError(err) } } -func (t *testReaderSuite) TestGetSwitchPath(c *check.C) { +func (t *testReaderSuite) TestGetSwitchPath() { var ( - relayDir = c.MkDir() + relayDir = t.T().TempDir() UUIDs = []string{ "53ea0ed1-9bf8-11e6-8bea-64006a897c73.000001", "53ea0ed1-9bf8-11e6-8bea-64006a897c72.000002", @@ -1509,53 +1522,54 @@ func (t *testReaderSuite) TestGetSwitchPath(c *check.C) { UUIDs = append(UUIDs, "invalid.uuid") // invalid UUID in UUIDs, error - t.writeUUIDs(c, relayDir, UUIDs) + t.writeUUIDs(relayDir, UUIDs) { cfg := &BinlogReaderConfig{RelayDir: relayDir, Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, true, currentUUID) switchPath, err := r.getSwitchPath() - c.Assert(switchPath, check.IsNil) - c.Assert(terror.ErrRelayParseUUIDSuffix.Equal(err), check.IsTrue) + t.Require().Nil(switchPath) + t.Require().True(terror.ErrRelayParseUUIDSuffix.Equal(err)) } UUIDs = UUIDs[:len(UUIDs)-1] // remove the invalid UUID - t.writeUUIDs(c, relayDir, UUIDs) + t.writeUUIDs(relayDir, UUIDs) // no next sub directory { cfg := &BinlogReaderConfig{RelayDir: relayDir, Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, true, UUIDs[0]) switchPath, err := r.getSwitchPath() - c.Assert(switchPath, check.IsNil) - c.Assert(err, check.ErrorMatches, fmt.Sprintf(".*%s.*(no such file or directory|The system cannot find the file specified).*", UUIDs[1])) + t.Require().Nil(switchPath) + t.Require().Error(err) + t.Require().Regexp(fmt.Sprintf(".*%s.*(no such file or directory|The system cannot find the file specified).*", UUIDs[1]), err.Error()) } err1 := os.Mkdir(filepath.Join(relayDir, UUIDs[1]), 0o700) - c.Assert(err1, check.IsNil) + t.Require().Nil(err1) // uuid directory exist, but no binlog file inside { cfg := &BinlogReaderConfig{RelayDir: relayDir, Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, true, UUIDs[0]) switchPath, err := r.getSwitchPath() - c.Assert(switchPath, check.IsNil) - c.Assert(err, check.IsNil) + t.Require().Nil(switchPath) + t.Require().NoError(err) } // create a relay log file in the next sub directory nextBinlogPath := filepath.Join(relayDir, UUIDs[1], "mysql-bin.000001") err1 = os.MkdirAll(filepath.Dir(nextBinlogPath), 0o700) - c.Assert(err1, check.IsNil) + t.Require().Nil(err1) err1 = os.WriteFile(nextBinlogPath, nil, 0o600) - c.Assert(err1, check.IsNil) + t.Require().Nil(err1) // switch to the next { cfg := &BinlogReaderConfig{RelayDir: relayDir, Flavor: gmysql.MySQLFlavor} r := newBinlogReaderForTest(log.L(), cfg, true, UUIDs[0]) switchPath, err := r.getSwitchPath() - c.Assert(switchPath.nextUUID, check.Equals, UUIDs[1]) - c.Assert(switchPath.nextBinlogName, check.Equals, filepath.Base(nextBinlogPath)) - c.Assert(err, check.IsNil) + t.Require().Equal(UUIDs[1], switchPath.nextUUID) + t.Require().Equal(filepath.Base(nextBinlogPath), switchPath.nextBinlogName) + t.Require().NoError(err) } } diff --git a/dm/relay/meta_test.go b/dm/relay/meta_test.go index b90a5031eb..2a2b1377b8 100644 --- a/dm/relay/meta_test.go +++ b/dm/relay/meta_test.go @@ -18,16 +18,13 @@ import ( "os" "path" "strings" + "testing" "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/pkg/gtid" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testMetaSuite{}) - -type testMetaSuite struct{} - type MetaTestCase struct { uuid string uuidWithSuffix string @@ -35,8 +32,8 @@ type MetaTestCase struct { gset mysql.GTIDSet } -func (r *testMetaSuite) TestLocalMeta(c *check.C) { - dir := c.MkDir() +func TestLocalMeta(t *testing.T) { + dir := t.TempDir() gset0, _ := gtid.ParserGTID("mysql", "") gset1, _ := gtid.ParserGTID("mysql", "85ab69d1-b21f-11e6-9c5e-64006a8978d2:1-12") @@ -75,27 +72,27 @@ func (r *testMetaSuite) TestLocalMeta(c *check.C) { // load, but empty lm := NewLocalMeta("mysql", dir) err := lm.Load() - c.Assert(err, check.IsNil) + require.NoError(t, err) uuid, pos := lm.Pos() - c.Assert(uuid, check.Equals, "") - c.Assert(pos, check.DeepEquals, minCheckpoint) + require.Equal(t, "", uuid) + require.Equal(t, minCheckpoint, pos) uuid, gset := lm.GTID() - c.Assert(uuid, check.Equals, "") - c.Assert(gset, check.DeepEquals, gset0) + require.Equal(t, "", uuid) + require.Equal(t, gset0, gset) err = lm.Save(minCheckpoint, nil) - c.Assert(err, check.NotNil) + require.Error(t, err) err = lm.Flush() - c.Assert(err, check.NotNil) + require.Error(t, err) dirty := lm.Dirty() - c.Assert(dirty, check.IsFalse) + require.False(t, dirty) // set currentSubDir because lm.doFlush need it currentUUID := "uuid.000001" - c.Assert(os.MkdirAll(path.Join(dir, currentUUID), 0o777), check.IsNil) + require.NoError(t, os.MkdirAll(path.Join(dir, currentUUID), 0o777)) setLocalMetaWithCurrentUUID := func() { lm = NewLocalMeta("mysql", dir) lm.(*LocalMeta).currentSubDir = currentUUID @@ -107,106 +104,106 @@ func (r *testMetaSuite) TestLocalMeta(c *check.C) { latestGTIDStr := "85ab69d1-b21f-11e6-9c5e-64006a8978d2:45-57" cs0 := cases[0] adjusted, err := lm.AdjustWithStartPos(cs0.pos.Name, cs0.gset.String(), false, latestBinlogName, latestGTIDStr) - c.Assert(err, check.IsNil) - c.Assert(adjusted, check.IsTrue) + require.NoError(t, err) + require.True(t, adjusted) uuid, pos = lm.Pos() - c.Assert(uuid, check.Equals, currentUUID) - c.Assert(pos.Name, check.Equals, cs0.pos.Name) + require.Equal(t, currentUUID, uuid) + require.Equal(t, cs0.pos.Name, pos.Name) uuid, gset = lm.GTID() - c.Assert(uuid, check.Equals, currentUUID) - c.Assert(gset.String(), check.Equals, "") + require.Equal(t, currentUUID, uuid) + require.Equal(t, "", gset.String()) // adjust to start pos with enableGTID setLocalMetaWithCurrentUUID() adjusted, err = lm.AdjustWithStartPos(cs0.pos.Name, cs0.gset.String(), true, latestBinlogName, latestGTIDStr) - c.Assert(err, check.IsNil) - c.Assert(adjusted, check.IsTrue) + require.NoError(t, err) + require.True(t, adjusted) uuid, pos = lm.Pos() - c.Assert(uuid, check.Equals, currentUUID) - c.Assert(pos.Name, check.Equals, cs0.pos.Name) + require.Equal(t, currentUUID, uuid) + require.Equal(t, cs0.pos.Name, pos.Name) uuid, gset = lm.GTID() - c.Assert(uuid, check.Equals, currentUUID) - c.Assert(gset, check.DeepEquals, cs0.gset) + require.Equal(t, currentUUID, uuid) + require.Equal(t, cs0.gset, gset) // adjust to the last binlog if start pos is empty setLocalMetaWithCurrentUUID() adjusted, err = lm.AdjustWithStartPos("", cs0.gset.String(), false, latestBinlogName, latestGTIDStr) - c.Assert(err, check.IsNil) - c.Assert(adjusted, check.IsTrue) + require.NoError(t, err) + require.True(t, adjusted) uuid, pos = lm.Pos() - c.Assert(uuid, check.Equals, currentUUID) - c.Assert(pos.Name, check.Equals, latestBinlogName) + require.Equal(t, currentUUID, uuid) + require.Equal(t, latestBinlogName, pos.Name) uuid, gset = lm.GTID() - c.Assert(uuid, check.Equals, currentUUID) - c.Assert(gset.String(), check.Equals, "") + require.Equal(t, currentUUID, uuid) + require.Equal(t, "", gset.String()) setLocalMetaWithCurrentUUID() adjusted, err = lm.AdjustWithStartPos("", "", true, latestBinlogName, latestGTIDStr) - c.Assert(err, check.IsNil) - c.Assert(adjusted, check.IsTrue) + require.NoError(t, err) + require.True(t, adjusted) uuid, pos = lm.Pos() - c.Assert(uuid, check.Equals, currentUUID) - c.Assert(pos.Name, check.Equals, latestBinlogName) + require.Equal(t, currentUUID, uuid) + require.Equal(t, latestBinlogName, pos.Name) uuid, gset = lm.GTID() - c.Assert(uuid, check.Equals, currentUUID) - c.Assert(gset.String(), check.Equals, latestGTIDStr) + require.Equal(t, currentUUID, uuid) + require.Equal(t, latestGTIDStr, gset.String()) // reset lm.(*LocalMeta).currentSubDir = "" for _, cs := range cases { err = lm.AddDir(cs.uuid, nil, nil, 0) - c.Assert(err, check.IsNil) + require.NoError(t, err) err = lm.Save(cs.pos, cs.gset) - c.Assert(err, check.IsNil) + require.NoError(t, err) currentUUID2, pos2 := lm.Pos() - c.Assert(currentUUID2, check.Equals, cs.uuidWithSuffix) - c.Assert(pos2, check.DeepEquals, cs.pos) + require.Equal(t, cs.uuidWithSuffix, currentUUID2) + require.Equal(t, cs.pos, pos2) currentUUID, gset = lm.GTID() - c.Assert(currentUUID, check.Equals, cs.uuidWithSuffix) - c.Assert(gset, check.DeepEquals, cs.gset) + require.Equal(t, cs.uuidWithSuffix, currentUUID) + require.Equal(t, cs.gset, gset) dirty = lm.Dirty() - c.Assert(dirty, check.IsTrue) + require.True(t, dirty) currentDir := lm.Dir() - c.Assert(strings.HasSuffix(currentDir, cs.uuidWithSuffix), check.IsTrue) + require.True(t, strings.HasSuffix(currentDir, cs.uuidWithSuffix)) } err = lm.Flush() - c.Assert(err, check.IsNil) + require.NoError(t, err) dirty = lm.Dirty() - c.Assert(dirty, check.IsFalse) + require.False(t, dirty) // try adjust to start pos again csn1 := cases[len(cases)-1] adjusted, err = lm.AdjustWithStartPos(cs0.pos.Name, cs0.gset.String(), false, "", "") - c.Assert(err, check.IsNil) - c.Assert(adjusted, check.IsFalse) + require.NoError(t, err) + require.False(t, adjusted) uuid, pos = lm.Pos() - c.Assert(uuid, check.Equals, csn1.uuidWithSuffix) - c.Assert(pos.Name, check.Equals, csn1.pos.Name) + require.Equal(t, csn1.uuidWithSuffix, uuid) + require.Equal(t, csn1.pos.Name, pos.Name) uuid, gset = lm.GTID() - c.Assert(uuid, check.Equals, csn1.uuidWithSuffix) - c.Assert(gset, check.DeepEquals, csn1.gset) + require.Equal(t, csn1.uuidWithSuffix, uuid) + require.Equal(t, csn1.gset, gset) // create a new LocalMeta, and load it lm2 := NewLocalMeta("mysql", dir) err = lm2.Load() - c.Assert(err, check.IsNil) + require.NoError(t, err) lastCase := cases[len(cases)-1] uuid, pos = lm2.Pos() - c.Assert(uuid, check.Equals, lastCase.uuidWithSuffix) - c.Assert(pos, check.DeepEquals, lastCase.pos) + require.Equal(t, lastCase.uuidWithSuffix, uuid) + require.Equal(t, lastCase.pos, pos) uuid, gset = lm2.GTID() - c.Assert(uuid, check.Equals, lastCase.uuidWithSuffix) - c.Assert(gset, check.DeepEquals, lastCase.gset) + require.Equal(t, lastCase.uuidWithSuffix, uuid) + require.Equal(t, lastCase.gset, gset) // another case for AddDir, specify pos and GTID cs := MetaTestCase{ @@ -216,24 +213,24 @@ func (r *testMetaSuite) TestLocalMeta(c *check.C) { gset: gset5, } err = lm.AddDir(cs.uuid, &cs.pos, cs.gset, 0) - c.Assert(err, check.IsNil) + require.NoError(t, err) dirty = lm.Dirty() - c.Assert(dirty, check.IsFalse) + require.False(t, dirty) currentUUID, pos = lm.Pos() - c.Assert(currentUUID, check.Equals, cs.uuidWithSuffix) - c.Assert(pos, check.DeepEquals, cs.pos) + require.Equal(t, cs.uuidWithSuffix, currentUUID) + require.Equal(t, cs.pos, pos) currentUUID, gset = lm.GTID() - c.Assert(currentUUID, check.Equals, cs.uuidWithSuffix) - c.Assert(gset, check.DeepEquals, cs.gset) + require.Equal(t, cs.uuidWithSuffix, currentUUID) + require.Equal(t, cs.gset, gset) currentDir := lm.Dir() - c.Assert(strings.HasSuffix(currentDir, cs.uuidWithSuffix), check.IsTrue) + require.True(t, strings.HasSuffix(currentDir, cs.uuidWithSuffix)) } -func (r *testMetaSuite) TestLocalMetaPotentialDataRace(c *check.C) { +func TestLocalMetaPotentialDataRace(t *testing.T) { var err error lm := NewLocalMeta("mysql", "/FAKE_DIR") uuidStr := "85ab69d1-b21f-11e6-9c5e-64006a8978d2" @@ -243,7 +240,7 @@ func (r *testMetaSuite) TestLocalMetaPotentialDataRace(c *check.C) { mysql.Position{Name: "mysql-bin.000001", Pos: 234}, initGSet, ) - c.Assert(err, check.IsNil) + require.NoError(t, err) ch1 := make(chan error) ch2 := make(chan error) @@ -289,7 +286,7 @@ func (r *testMetaSuite) TestLocalMetaPotentialDataRace(c *check.C) { close(pendingCh) ch1Err := <-ch1 ch2Err := <-ch2 - c.Assert(ch1Err, check.IsNil) - c.Assert(ch2Err, check.IsNil) - c.Logf("GTID string from the go routine: %s", gtidString) + require.NoError(t, ch1Err) + require.NoError(t, ch2Err) + t.Logf("GTID string from the go routine: %s", gtidString) } diff --git a/dm/relay/purger_helper_test.go b/dm/relay/purger_helper_test.go index 44cf7dfcb2..c735aa5b83 100644 --- a/dm/relay/purger_helper_test.go +++ b/dm/relay/purger_helper_test.go @@ -18,33 +18,32 @@ import ( "path/filepath" "time" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/pkg/log" "github.com/pingcap/tiflow/dm/pkg/streamer" "github.com/pingcap/tiflow/dm/pkg/utils" ) -func (t *testPurgerSuite) TestPurgeRelayFilesBeforeFile(c *check.C) { +func (t *testPurgerSuite) TestPurgeRelayFilesBeforeFile() { // UUID mismatch safeRelay := &streamer.RelayLogInfo{ SubDir: "not-found-uuid", } files, err := getRelayFilesBeforeFile(log.L(), "", t.uuids, safeRelay) - c.Assert(err, check.NotNil) - c.Assert(files, check.IsNil) + t.Require().Error(err) + t.Require().Nil(files) // create relay log dir - baseDir := c.MkDir() + baseDir := t.T().TempDir() // empty relay log dirs safeRelay = &streamer.RelayLogInfo{ SubDir: t.uuids[len(t.uuids)-1], } files, err = getRelayFilesBeforeFile(log.L(), baseDir, t.uuids, safeRelay) - c.Assert(err, check.NotNil) - c.Assert(files, check.IsNil) + t.Require().Error(err) + t.Require().Nil(files) // create relay log files - relayDirsPath, relayFilesPath, _ := t.genRelayLogFiles(c, baseDir, -1, -1) + relayDirsPath, relayFilesPath, _ := t.genRelayLogFiles(baseDir, -1, -1) // no older safeRelay = &streamer.RelayLogInfo{ @@ -52,8 +51,8 @@ func (t *testPurgerSuite) TestPurgeRelayFilesBeforeFile(c *check.C) { Filename: t.relayFiles[0][0], } files, err = getRelayFilesBeforeFile(log.L(), baseDir, t.uuids, safeRelay) - c.Assert(err, check.IsNil) - c.Assert(files, check.DeepEquals, []*subRelayFiles{}) + t.Require().NoError(err) + t.Require().Equal([]*subRelayFiles{}, files) // only relay files in first sub dir safeRelay = &streamer.RelayLogInfo{ @@ -61,11 +60,11 @@ func (t *testPurgerSuite) TestPurgeRelayFilesBeforeFile(c *check.C) { Filename: t.relayFiles[1][0], } files, err = getRelayFilesBeforeFile(log.L(), baseDir, t.uuids, safeRelay) - c.Assert(err, check.IsNil) - c.Assert(len(files), check.Equals, 1) - c.Assert(files[0].dir, check.Equals, relayDirsPath[0]) - c.Assert(files[0].files, check.DeepEquals, relayFilesPath[0]) - c.Assert(files[0].hasAll, check.IsTrue) + t.Require().NoError(err) + t.Require().Equal(1, len(files)) + t.Require().Equal(relayDirsPath[0], files[0].dir) + t.Require().Equal(relayFilesPath[0], files[0].files) + t.Require().True(files[0].hasAll) // relay files in first sub dir, and some in second sub dir safeRelay = &streamer.RelayLogInfo{ @@ -73,14 +72,14 @@ func (t *testPurgerSuite) TestPurgeRelayFilesBeforeFile(c *check.C) { Filename: t.relayFiles[1][len(t.relayFiles[1])-1], } files, err = getRelayFilesBeforeFile(log.L(), baseDir, t.uuids, safeRelay) - c.Assert(err, check.IsNil) - c.Assert(len(files), check.Equals, 2) - c.Assert(files[0].dir, check.Equals, relayDirsPath[0]) - c.Assert(files[0].files, check.DeepEquals, relayFilesPath[0]) - c.Assert(files[0].hasAll, check.IsTrue) - c.Assert(files[1].dir, check.Equals, relayDirsPath[1]) - c.Assert(files[1].files, check.DeepEquals, relayFilesPath[1][:len(t.relayFiles[1])-1]) - c.Assert(files[1].hasAll, check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(2, len(files)) + t.Require().Equal(relayDirsPath[0], files[0].dir) + t.Require().Equal(relayFilesPath[0], files[0].files) + t.Require().True(files[0].hasAll) + t.Require().Equal(relayDirsPath[1], files[1].dir) + t.Require().Equal(relayFilesPath[1][:len(t.relayFiles[1])-1], files[1].files) + t.Require().False(files[1].hasAll) // relay files in first and second sub dir, and some in third sub dir safeRelay = &streamer.RelayLogInfo{ @@ -88,47 +87,47 @@ func (t *testPurgerSuite) TestPurgeRelayFilesBeforeFile(c *check.C) { Filename: t.relayFiles[2][1], } files, err = getRelayFilesBeforeFile(log.L(), baseDir, t.uuids, safeRelay) - c.Assert(err, check.IsNil) - c.Assert(len(files), check.Equals, 3) - c.Assert(files[0].dir, check.Equals, relayDirsPath[0]) - c.Assert(files[0].files, check.DeepEquals, relayFilesPath[0]) - c.Assert(files[0].hasAll, check.IsTrue) - c.Assert(files[1].dir, check.Equals, relayDirsPath[1]) - c.Assert(files[1].files, check.DeepEquals, relayFilesPath[1]) - c.Assert(files[1].hasAll, check.IsTrue) - c.Assert(files[2].dir, check.Equals, relayDirsPath[2]) - c.Assert(files[2].files, check.DeepEquals, relayFilesPath[2][:1]) - c.Assert(files[2].hasAll, check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(3, len(files)) + t.Require().Equal(relayDirsPath[0], files[0].dir) + t.Require().Equal(relayFilesPath[0], files[0].files) + t.Require().True(files[0].hasAll) + t.Require().Equal(relayDirsPath[1], files[1].dir) + t.Require().Equal(relayFilesPath[1], files[1].files) + t.Require().True(files[1].hasAll) + t.Require().Equal(relayDirsPath[2], files[2].dir) + t.Require().Equal(relayFilesPath[2][:1], files[2].files) + t.Require().False(files[2].hasAll) // write a fake meta file to first sub dir fakeMeta := filepath.Join(relayDirsPath[0], utils.MetaFilename) - c.Assert(os.WriteFile(fakeMeta, []byte{}, 0o666), check.IsNil) + t.Require().Nil(os.WriteFile(fakeMeta, []byte{}, 0o666)) // purge all relay log files in first and second sub dir, and some in third sub dir err = purgeRelayFilesBeforeFile(log.L(), baseDir, t.uuids, safeRelay) - c.Assert(err, check.IsNil) - c.Assert(utils.IsDirExists(relayDirsPath[0]), check.IsFalse) - c.Assert(utils.IsDirExists(relayDirsPath[1]), check.IsFalse) - c.Assert(utils.IsDirExists(relayDirsPath[2]), check.IsTrue) - c.Assert(utils.IsFileExists(relayFilesPath[2][0]), check.IsFalse) - c.Assert(utils.IsFileExists(relayFilesPath[2][1]), check.IsTrue) - c.Assert(utils.IsFileExists(relayFilesPath[2][2]), check.IsTrue) + t.Require().NoError(err) + t.Require().False(utils.IsDirExists(relayDirsPath[0])) + t.Require().False(utils.IsDirExists(relayDirsPath[1])) + t.Require().True(utils.IsDirExists(relayDirsPath[2])) + t.Require().False(utils.IsFileExists(relayFilesPath[2][0])) + t.Require().True(utils.IsFileExists(relayFilesPath[2][1])) + t.Require().True(utils.IsFileExists(relayFilesPath[2][2])) } -func (t *testPurgerSuite) TestPurgeRelayFilesBeforeFileAndTime(c *check.C) { +func (t *testPurgerSuite) TestPurgeRelayFilesBeforeFileAndTime() { // create relay log dir - baseDir := c.MkDir() + baseDir := t.T().TempDir() // empty relay log dirs safeRelay := &streamer.RelayLogInfo{ SubDir: t.uuids[len(t.uuids)-1], } files, err := getRelayFilesBeforeFileAndTime(log.L(), baseDir, t.uuids, safeRelay, time.Now()) - c.Assert(err, check.NotNil) - c.Assert(files, check.IsNil) + t.Require().Error(err) + t.Require().Nil(files) // create relay log files - relayDirsPath, relayFilesPath, safeTime := t.genRelayLogFiles(c, baseDir, 1, 1) + relayDirsPath, relayFilesPath, safeTime := t.genRelayLogFiles(baseDir, 1, 1) // safeRelay older than safeTime safeRelay = &streamer.RelayLogInfo{ @@ -136,11 +135,11 @@ func (t *testPurgerSuite) TestPurgeRelayFilesBeforeFileAndTime(c *check.C) { Filename: t.relayFiles[1][0], } files, err = getRelayFilesBeforeFileAndTime(log.L(), baseDir, t.uuids, safeRelay, safeTime) - c.Assert(err, check.IsNil) - c.Assert(len(files), check.Equals, 1) - c.Assert(files[0].dir, check.Equals, relayDirsPath[0]) - c.Assert(files[0].files, check.DeepEquals, relayFilesPath[0]) - c.Assert(files[0].hasAll, check.IsTrue) + t.Require().NoError(err) + t.Require().Equal(1, len(files)) + t.Require().Equal(relayDirsPath[0], files[0].dir) + t.Require().Equal(relayFilesPath[0], files[0].files) + t.Require().True(files[0].hasAll) // safeRelay newer than safeTime safeRelay = &streamer.RelayLogInfo{ @@ -148,26 +147,26 @@ func (t *testPurgerSuite) TestPurgeRelayFilesBeforeFileAndTime(c *check.C) { Filename: t.relayFiles[2][0], } files, err = getRelayFilesBeforeFileAndTime(log.L(), baseDir, t.uuids, safeRelay, safeTime) - c.Assert(err, check.IsNil) - c.Assert(len(files), check.Equals, 2) - c.Assert(files[0].dir, check.Equals, relayDirsPath[0]) - c.Assert(files[0].files, check.DeepEquals, relayFilesPath[0]) - c.Assert(files[0].hasAll, check.IsTrue) - c.Assert(files[1].dir, check.Equals, relayDirsPath[1]) - c.Assert(files[1].files, check.DeepEquals, relayFilesPath[1][:2]) - c.Assert(files[1].hasAll, check.IsFalse) + t.Require().NoError(err) + t.Require().Equal(2, len(files)) + t.Require().Equal(relayDirsPath[0], files[0].dir) + t.Require().Equal(relayFilesPath[0], files[0].files) + t.Require().True(files[0].hasAll) + t.Require().Equal(relayDirsPath[1], files[1].dir) + t.Require().Equal(relayFilesPath[1][:2], files[1].files) + t.Require().False(files[1].hasAll) // write a fake meta file to first sub dir fakeMeta := filepath.Join(relayDirsPath[0], utils.MetaFilename) - c.Assert(os.WriteFile(fakeMeta, []byte{}, 0o666), check.IsNil) + t.Require().Nil(os.WriteFile(fakeMeta, []byte{}, 0o666)) // purge all relay log files in first and second sub dir, and some in third sub dir err = purgeRelayFilesBeforeFileAndTime(log.L(), baseDir, t.uuids, safeRelay, safeTime) - c.Assert(err, check.IsNil) - c.Assert(utils.IsDirExists(relayDirsPath[0]), check.IsFalse) - c.Assert(utils.IsDirExists(relayDirsPath[1]), check.IsTrue) - c.Assert(utils.IsDirExists(relayDirsPath[2]), check.IsTrue) - c.Assert(utils.IsFileExists(relayFilesPath[1][0]), check.IsFalse) - c.Assert(utils.IsFileExists(relayFilesPath[1][1]), check.IsFalse) - c.Assert(utils.IsFileExists(relayFilesPath[1][2]), check.IsTrue) + t.Require().NoError(err) + t.Require().False(utils.IsDirExists(relayDirsPath[0])) + t.Require().True(utils.IsDirExists(relayDirsPath[1])) + t.Require().True(utils.IsDirExists(relayDirsPath[2])) + t.Require().False(utils.IsFileExists(relayFilesPath[1][0])) + t.Require().False(utils.IsFileExists(relayFilesPath[1][1])) + t.Require().True(utils.IsFileExists(relayFilesPath[1][2])) } diff --git a/dm/relay/purger_test.go b/dm/relay/purger_test.go index 34872488e3..e90b8cb6d8 100644 --- a/dm/relay/purger_test.go +++ b/dm/relay/purger_test.go @@ -19,56 +19,62 @@ import ( "os" "path/filepath" "strings" + "testing" "time" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/config" "github.com/pingcap/tiflow/dm/pb" "github.com/pingcap/tiflow/dm/pkg/streamer" "github.com/pingcap/tiflow/dm/pkg/utils" + "github.com/stretchr/testify/suite" ) -var _ = check.Suite(&testPurgerSuite{ - uuids: []string{ +func TestPurgerSuite(t *testing.T) { + suite.Run(t, new(testPurgerSuite)) +} + +type testPurgerSuite struct { + suite.Suite + uuids []string + relayFiles [][]string + activeRelayLog *streamer.RelayLogInfo +} + +func (t *testPurgerSuite) SetupTest() { + t.uuids = []string{ "c6ae5afe-c7a3-11e8-a19d-0242ac130006.000001", "e9540a0d-f16d-11e8-8cb7-0242ac130008.000002", "195c342f-f46e-11e8-927c-0242ac150008.000003", - }, - relayFiles: [][]string{ + } + t.relayFiles = [][]string{ {"mysql-bin.000001", "mysql-bin.000002", "mysql-bin.000003"}, {"mysql-bin.000001", "mysql-bin.000002", "mysql-bin.000003"}, {"mysql-bin.000001", "mysql-bin.000002", "mysql-bin.000003"}, - }, - activeRelayLog: &streamer.RelayLogInfo{ + } + t.activeRelayLog = &streamer.RelayLogInfo{ TaskName: fakeStrategyTaskName, SubDir: "e9540a0d-f16d-11e8-8cb7-0242ac130008.000002", SubDirSuffix: 2, Filename: "mysql-bin.000003", // last in second sub dir - }, -}) - -type testPurgerSuite struct { - uuids []string - relayFiles [][]string - activeRelayLog *streamer.RelayLogInfo + } } func (t *testPurgerSuite) EarliestActiveRelayLog() *streamer.RelayLogInfo { return t.activeRelayLog } -func (t *testPurgerSuite) TestPurgeManuallyInactive(c *check.C) { +func (t *testPurgerSuite) TestPurgeManuallyInactive() { // create relay log dir - baseDir := c.MkDir() + baseDir := t.T().TempDir() // prepare files and directories - relayDirsPath, relayFilesPath, _ := t.genRelayLogFiles(c, baseDir, -1, -1) - c.Assert(len(relayDirsPath), check.Equals, 3) - c.Assert(len(relayFilesPath), check.Equals, 3) - c.Assert(len(relayFilesPath[2]), check.Equals, 3) + relayDirsPath, relayFilesPath, _ := t.genRelayLogFiles(baseDir, -1, -1) + t.Require().Equal(3, len(relayDirsPath)) + t.Require().Equal(3, len(relayFilesPath)) + t.Require().Equal(3, len(relayFilesPath[2])) err := t.genUUIDIndexFile(baseDir) - c.Assert(err, check.IsNil) + t.Require().NoError(err) cfg := config.PurgeConfig{ Interval: 0, // disable automatically @@ -80,32 +86,32 @@ func (t *testPurgerSuite) TestPurgeManuallyInactive(c *check.C) { Inactive: true, } err = purger.Do(context.Background(), req) - c.Assert(err, check.IsNil) + t.Require().NoError(err) - c.Assert(utils.IsDirExists(relayDirsPath[0]), check.IsFalse) - c.Assert(utils.IsDirExists(relayDirsPath[1]), check.IsTrue) - c.Assert(utils.IsDirExists(relayDirsPath[2]), check.IsTrue) + t.Require().False(utils.IsDirExists(relayDirsPath[0])) + t.Require().True(utils.IsDirExists(relayDirsPath[1])) + t.Require().True(utils.IsDirExists(relayDirsPath[2])) - c.Assert(utils.IsFileExists(relayFilesPath[1][0]), check.IsFalse) - c.Assert(utils.IsFileExists(relayFilesPath[1][1]), check.IsFalse) - c.Assert(utils.IsFileExists(relayFilesPath[1][2]), check.IsTrue) + t.Require().False(utils.IsFileExists(relayFilesPath[1][0])) + t.Require().False(utils.IsFileExists(relayFilesPath[1][1])) + t.Require().True(utils.IsFileExists(relayFilesPath[1][2])) for _, fp := range relayFilesPath[2] { - c.Assert(utils.IsFileExists(fp), check.IsTrue) + t.Require().True(utils.IsFileExists(fp)) } } -func (t *testPurgerSuite) TestPurgeManuallyTime(c *check.C) { +func (t *testPurgerSuite) TestPurgeManuallyTime() { // create relay log dir - baseDir := c.MkDir() + baseDir := t.T().TempDir() // prepare files and directories - relayDirsPath, relayFilesPath, safeTime := t.genRelayLogFiles(c, baseDir, 1, 0) - c.Assert(len(relayDirsPath), check.Equals, 3) - c.Assert(len(relayFilesPath), check.Equals, 3) - c.Assert(len(relayFilesPath[2]), check.Equals, 3) + relayDirsPath, relayFilesPath, safeTime := t.genRelayLogFiles(baseDir, 1, 0) + t.Require().Equal(3, len(relayDirsPath)) + t.Require().Equal(3, len(relayFilesPath)) + t.Require().Equal(3, len(relayFilesPath[2])) err := t.genUUIDIndexFile(baseDir) - c.Assert(err, check.IsNil) + t.Require().NoError(err) cfg := config.PurgeConfig{ Interval: 0, // disable automatically @@ -117,32 +123,32 @@ func (t *testPurgerSuite) TestPurgeManuallyTime(c *check.C) { Time: safeTime.Unix(), } err = purger.Do(context.Background(), req) - c.Assert(err, check.IsNil) + t.Require().NoError(err) - c.Assert(utils.IsDirExists(relayDirsPath[0]), check.IsFalse) - c.Assert(utils.IsDirExists(relayDirsPath[1]), check.IsTrue) - c.Assert(utils.IsDirExists(relayDirsPath[2]), check.IsTrue) + t.Require().False(utils.IsDirExists(relayDirsPath[0])) + t.Require().True(utils.IsDirExists(relayDirsPath[1])) + t.Require().True(utils.IsDirExists(relayDirsPath[2])) - c.Assert(utils.IsFileExists(relayFilesPath[1][0]), check.IsFalse) - c.Assert(utils.IsFileExists(relayFilesPath[1][1]), check.IsTrue) - c.Assert(utils.IsFileExists(relayFilesPath[1][2]), check.IsTrue) + t.Require().False(utils.IsFileExists(relayFilesPath[1][0])) + t.Require().True(utils.IsFileExists(relayFilesPath[1][1])) + t.Require().True(utils.IsFileExists(relayFilesPath[1][2])) for _, fp := range relayFilesPath[2] { - c.Assert(utils.IsFileExists(fp), check.IsTrue) + t.Require().True(utils.IsFileExists(fp)) } } -func (t *testPurgerSuite) TestPurgeManuallyFilename(c *check.C) { +func (t *testPurgerSuite) TestPurgeManuallyFilename() { // create relay log dir - baseDir := c.MkDir() + baseDir := t.T().TempDir() // prepare files and directories - relayDirsPath, relayFilesPath, _ := t.genRelayLogFiles(c, baseDir, -1, -1) - c.Assert(len(relayDirsPath), check.Equals, 3) - c.Assert(len(relayFilesPath), check.Equals, 3) - c.Assert(len(relayFilesPath[2]), check.Equals, 3) + relayDirsPath, relayFilesPath, _ := t.genRelayLogFiles(baseDir, -1, -1) + t.Require().Equal(3, len(relayDirsPath)) + t.Require().Equal(3, len(relayFilesPath)) + t.Require().Equal(3, len(relayFilesPath[2])) err := t.genUUIDIndexFile(baseDir) - c.Assert(err, check.IsNil) + t.Require().NoError(err) cfg := config.PurgeConfig{ Interval: 0, // disable automatically @@ -155,35 +161,35 @@ func (t *testPurgerSuite) TestPurgeManuallyFilename(c *check.C) { SubDir: t.uuids[0], } err = purger.Do(context.Background(), req) - c.Assert(err, check.IsNil) + t.Require().NoError(err) - c.Assert(utils.IsDirExists(relayDirsPath[0]), check.IsTrue) - c.Assert(utils.IsDirExists(relayDirsPath[1]), check.IsTrue) - c.Assert(utils.IsDirExists(relayDirsPath[2]), check.IsTrue) + t.Require().True(utils.IsDirExists(relayDirsPath[0])) + t.Require().True(utils.IsDirExists(relayDirsPath[1])) + t.Require().True(utils.IsDirExists(relayDirsPath[2])) - c.Assert(utils.IsFileExists(relayFilesPath[0][0]), check.IsFalse) - c.Assert(utils.IsFileExists(relayFilesPath[0][1]), check.IsFalse) - c.Assert(utils.IsFileExists(relayFilesPath[0][2]), check.IsTrue) + t.Require().False(utils.IsFileExists(relayFilesPath[0][0])) + t.Require().False(utils.IsFileExists(relayFilesPath[0][1])) + t.Require().True(utils.IsFileExists(relayFilesPath[0][2])) for _, fp := range relayFilesPath[1] { - c.Assert(utils.IsFileExists(fp), check.IsTrue) + t.Require().True(utils.IsFileExists(fp)) } for _, fp := range relayFilesPath[2] { - c.Assert(utils.IsFileExists(fp), check.IsTrue) + t.Require().True(utils.IsFileExists(fp)) } } -func (t *testPurgerSuite) TestPurgeAutomaticallyTime(c *check.C) { +func (t *testPurgerSuite) TestPurgeAutomaticallyTime() { // create relay log dir - baseDir := c.MkDir() + baseDir := t.T().TempDir() // prepare files and directories - relayDirsPath, relayFilesPath, _ := t.genRelayLogFiles(c, baseDir, -1, -1) - c.Assert(len(relayDirsPath), check.Equals, 3) - c.Assert(len(relayFilesPath), check.Equals, 3) - c.Assert(len(relayFilesPath[2]), check.Equals, 3) + relayDirsPath, relayFilesPath, _ := t.genRelayLogFiles(baseDir, -1, -1) + t.Require().Equal(3, len(relayDirsPath)) + t.Require().Equal(3, len(relayFilesPath)) + t.Require().Equal(3, len(relayFilesPath[2])) err := t.genUUIDIndexFile(baseDir) - c.Assert(err, check.IsNil) + t.Require().NoError(err) cfg := config.PurgeConfig{ Interval: 1, // enable automatically @@ -196,7 +202,7 @@ func (t *testPurgerSuite) TestPurgeAutomaticallyTime(c *check.C) { for _, fps := range relayFilesPath { for _, fp := range fps { err = os.Chtimes(fp, aTime, mTime) - c.Assert(err, check.IsNil) + t.Require().NoError(err) } } @@ -205,33 +211,33 @@ func (t *testPurgerSuite) TestPurgeAutomaticallyTime(c *check.C) { time.Sleep(2 * time.Second) // sleep enough time to purge all inactive relay log files purger.Close() - c.Assert(utils.IsDirExists(relayDirsPath[0]), check.IsFalse) - c.Assert(utils.IsDirExists(relayDirsPath[1]), check.IsTrue) - c.Assert(utils.IsDirExists(relayDirsPath[2]), check.IsTrue) + t.Require().False(utils.IsDirExists(relayDirsPath[0])) + t.Require().True(utils.IsDirExists(relayDirsPath[1])) + t.Require().True(utils.IsDirExists(relayDirsPath[2])) - c.Assert(utils.IsFileExists(relayFilesPath[1][0]), check.IsFalse) - c.Assert(utils.IsFileExists(relayFilesPath[1][1]), check.IsFalse) - c.Assert(utils.IsFileExists(relayFilesPath[1][2]), check.IsTrue) + t.Require().False(utils.IsFileExists(relayFilesPath[1][0])) + t.Require().False(utils.IsFileExists(relayFilesPath[1][1])) + t.Require().True(utils.IsFileExists(relayFilesPath[1][2])) for _, fp := range relayFilesPath[2] { - c.Assert(utils.IsFileExists(fp), check.IsTrue) + t.Require().True(utils.IsFileExists(fp)) } } -func (t *testPurgerSuite) TestPurgeAutomaticallySpace(c *check.C) { +func (t *testPurgerSuite) TestPurgeAutomaticallySpace() { // create relay log dir - baseDir := c.MkDir() + baseDir := t.T().TempDir() // prepare files and directories - relayDirsPath, relayFilesPath, _ := t.genRelayLogFiles(c, baseDir, -1, -1) - c.Assert(len(relayDirsPath), check.Equals, 3) - c.Assert(len(relayFilesPath), check.Equals, 3) - c.Assert(len(relayFilesPath[2]), check.Equals, 3) + relayDirsPath, relayFilesPath, _ := t.genRelayLogFiles(baseDir, -1, -1) + t.Require().Equal(3, len(relayDirsPath)) + t.Require().Equal(3, len(relayFilesPath)) + t.Require().Equal(3, len(relayFilesPath[2])) err := t.genUUIDIndexFile(baseDir) - c.Assert(err, check.IsNil) + t.Require().NoError(err) storageSize, err := utils.GetStorageSize(baseDir) - c.Assert(err, check.IsNil) + t.Require().NoError(err) cfg := config.PurgeConfig{ Interval: 1, // enable automatically @@ -243,19 +249,19 @@ func (t *testPurgerSuite) TestPurgeAutomaticallySpace(c *check.C) { time.Sleep(2 * time.Second) // sleep enough time to purge all inactive relay log files purger.Close() - c.Assert(utils.IsDirExists(relayDirsPath[0]), check.IsFalse) - c.Assert(utils.IsDirExists(relayDirsPath[1]), check.IsTrue) - c.Assert(utils.IsDirExists(relayDirsPath[2]), check.IsTrue) + t.Require().False(utils.IsDirExists(relayDirsPath[0])) + t.Require().True(utils.IsDirExists(relayDirsPath[1])) + t.Require().True(utils.IsDirExists(relayDirsPath[2])) - c.Assert(utils.IsFileExists(relayFilesPath[1][0]), check.IsFalse) - c.Assert(utils.IsFileExists(relayFilesPath[1][1]), check.IsFalse) - c.Assert(utils.IsFileExists(relayFilesPath[1][2]), check.IsTrue) + t.Require().False(utils.IsFileExists(relayFilesPath[1][0])) + t.Require().False(utils.IsFileExists(relayFilesPath[1][1])) + t.Require().True(utils.IsFileExists(relayFilesPath[1][2])) for _, fp := range relayFilesPath[2] { - c.Assert(utils.IsFileExists(fp), check.IsTrue) + t.Require().True(utils.IsFileExists(fp)) } } -func (t *testPurgerSuite) genRelayLogFiles(c *check.C, baseDir string, safeTimeIdxI, safeTimeIdxJ int) ([]string, [][]string, time.Time) { +func (t *testPurgerSuite) genRelayLogFiles(baseDir string, safeTimeIdxI, safeTimeIdxJ int) ([]string, [][]string, time.Time) { var ( relayDirsPath = make([]string, 0, 3) relayFilesPath = make([][]string, 0, 3) @@ -265,7 +271,7 @@ func (t *testPurgerSuite) genRelayLogFiles(c *check.C, baseDir string, safeTimeI for _, uuid := range t.uuids { dir := filepath.Join(baseDir, uuid) err := os.Mkdir(dir, 0o700) - c.Assert(err, check.IsNil) + t.Require().NoError(err) relayDirsPath = append(relayDirsPath, dir) } @@ -276,7 +282,7 @@ func (t *testPurgerSuite) genRelayLogFiles(c *check.C, baseDir string, safeTimeI for j, fn := range t.relayFiles[i] { fp := filepath.Join(dir, fn) err2 := os.WriteFile(fp, []byte("meaningless file content"), 0o644) - c.Assert(err2, check.IsNil) + t.Require().Nil(err2) relayFilesPath[i] = append(relayFilesPath[i], fp) if i == safeTimeIdxI && j == safeTimeIdxJ { @@ -316,7 +322,7 @@ func (i *fakeInterceptor) ForbidPurge() (bool, string) { return true, i.msg } -func (t *testPurgerSuite) TestPurgerInterceptor(c *check.C) { +func (t *testPurgerSuite) TestPurgerInterceptor() { cfg := config.PurgeConfig{} interceptor := newFakeInterceptor() @@ -326,6 +332,6 @@ func (t *testPurgerSuite) TestPurgerInterceptor(c *check.C) { Inactive: true, } err := purger.Do(context.Background(), req) - c.Assert(err, check.NotNil) - c.Assert(strings.Contains(err.Error(), interceptor.msg), check.IsTrue) + t.Require().Error(err) + t.Require().True(strings.Contains(err.Error(), interceptor.msg)) } diff --git a/dm/relay/relay_test.go b/dm/relay/relay_test.go index ec6f3ffbc2..e13ccc5529 100644 --- a/dm/relay/relay_test.go +++ b/dm/relay/relay_test.go @@ -27,7 +27,6 @@ import ( "github.com/DATA-DOG/go-sqlmock" gmysql "github.com/go-mysql-org/go-mysql/mysql" "github.com/go-mysql-org/go-mysql/replication" - "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/parser" @@ -38,22 +37,15 @@ import ( "github.com/pingcap/tiflow/dm/pkg/gtid" "github.com/pingcap/tiflow/dm/pkg/log" "github.com/pingcap/tiflow/dm/pkg/utils" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testRelaySuite{}) - -func TestSuite(t *testing.T) { - check.TestingT(t) -} - -type testRelaySuite struct{} - -func newRelayCfg(c *check.C, flavor string) *Config { +func newRelayCfg(t *testing.T, flavor string) *Config { dbCfg := getDBConfigForTest() return &Config{ EnableGTID: false, // position mode, so auto-positioning can work Flavor: flavor, - RelayDir: c.MkDir(), + RelayDir: t.TempDir(), ServerID: 12321, From: dbconfig.DBConfig{ Host: dbCfg.Host, @@ -143,7 +135,7 @@ func (w *mockWriter) Flush() error { return nil } -func (t *testRelaySuite) TestTryRecoverLatestFile(c *check.C) { +func TestTryRecoverLatestFile(t *testing.T) { var ( uuid = "24ecd093-8cec-11e9-aa0d-0242ac170002" uuidWithSuffix = fmt.Sprintf("%s.000001", uuid) @@ -156,90 +148,90 @@ func (t *testRelaySuite) TestTryRecoverLatestFile(c *check.C) { startPos = gmysql.Position{Name: filename, Pos: 123} parser2 = parser.New() - relayCfg = newRelayCfg(c, gmysql.MySQLFlavor) + relayCfg = newRelayCfg(t, gmysql.MySQLFlavor) r = NewRelay(relayCfg).(*Relay) ) - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/conn/GetGTIDPurged", `return("406a3f61-690d-11e7-87c5-6c92bf46f384:1-122")`), check.IsNil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/conn/GetGTIDPurged", `return("406a3f61-690d-11e7-87c5-6c92bf46f384:1-122")`)) //nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/pkg/conn/GetGTIDPurged") cfg := getDBConfigForTest() - conn.InitMockDB(c) + conn.InitMockDB(t) db, err := conn.GetUpstreamDB(cfg) - c.Assert(err, check.IsNil) + require.NoError(t, err) r.db = db - c.Assert(r.Init(context.Background()), check.IsNil) + require.NoError(t, r.Init(context.Background())) // purge old relay dir f, err := os.Create(filepath.Join(r.cfg.RelayDir, "old_relay_log")) - c.Assert(err, check.IsNil) + require.NoError(t, err) f.Close() - c.Assert(r.PurgeRelayDir(), check.IsNil) + require.NoError(t, r.PurgeRelayDir()) files, err := os.ReadDir(r.cfg.RelayDir) - c.Assert(err, check.IsNil) - c.Assert(files, check.HasLen, 0) + require.NoError(t, err) + require.Len(t, files, 0) - c.Assert(r.meta.Load(), check.IsNil) + require.NoError(t, r.meta.Load()) // no file specified, no need to recover - c.Assert(r.tryRecoverLatestFile(context.Background(), parser2), check.IsNil) + require.Nil(t, r.tryRecoverLatestFile(context.Background(), parser2)) // save position into meta - c.Assert(r.meta.AddDir(uuid, &startPos, nil, 0), check.IsNil) + require.Nil(t, r.meta.AddDir(uuid, &startPos, nil, 0)) // relay log file does not exists, no need to recover - c.Assert(r.tryRecoverLatestFile(context.Background(), parser2), check.IsNil) + require.Nil(t, r.tryRecoverLatestFile(context.Background(), parser2)) // use a generator to generate some binlog events previousGTIDSet, err := gtid.ParserGTID(relayCfg.Flavor, previousGTIDSetStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) latestGTID1, err := gtid.ParserGTID(relayCfg.Flavor, latestGTIDStr1) - c.Assert(err, check.IsNil) + require.NoError(t, err) latestGTID2, err := gtid.ParserGTID(relayCfg.Flavor, latestGTIDStr2) - c.Assert(err, check.IsNil) - g, events, data := genBinlogEventsWithGTIDs(c, relayCfg.Flavor, previousGTIDSet, latestGTID1, latestGTID2) + require.NoError(t, err) + g, events, data := genBinlogEventsWithGTIDs(t, relayCfg.Flavor, previousGTIDSet, latestGTID1, latestGTID2) // write events into relay log file err = os.WriteFile(filepath.Join(r.meta.Dir(), filename), data, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) // all events/transactions are complete, no need to recover - c.Assert(r.tryRecoverLatestFile(context.Background(), parser2), check.IsNil) + require.Nil(t, r.tryRecoverLatestFile(context.Background(), parser2)) // now, we will update position/GTID set in meta to latest location in relay logs lastEvent := events[len(events)-1] pos := startPos pos.Pos = lastEvent.Header.LogPos - t.verifyMetadata(c, r, uuidWithSuffix, pos, recoverGTIDSetStr, []string{uuidWithSuffix}) + verifyMetadata(t, r, uuidWithSuffix, pos, recoverGTIDSetStr, []string{uuidWithSuffix}) // write some invalid data into the relay log file f, err = os.OpenFile(filepath.Join(r.meta.Dir(), filename), os.O_WRONLY|os.O_APPEND, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, err = f.Write([]byte("invalid event data")) - c.Assert(err, check.IsNil) + require.NoError(t, err) f.Close() // write a greater GTID sets in meta greaterGITDSet, err := gtid.ParserGTID(relayCfg.Flavor, greaterGITDSetStr) - c.Assert(err, check.IsNil) - c.Assert(r.SaveMeta(startPos, greaterGITDSet), check.IsNil) + require.NoError(t, err) + require.Nil(t, r.SaveMeta(startPos, greaterGITDSet)) // invalid data truncated, meta updated - c.Assert(r.tryRecoverLatestFile(context.Background(), parser2), check.IsNil) + require.Nil(t, r.tryRecoverLatestFile(context.Background(), parser2)) _, latestPos := r.meta.Pos() - c.Assert(latestPos, check.DeepEquals, gmysql.Position{Name: filename, Pos: g.LatestPos}) + require.Equal(t, gmysql.Position{Name: filename, Pos: g.LatestPos}, latestPos) _, latestGTIDs := r.meta.GTID() recoverGTIDSet, err := gtid.ParserGTID(relayCfg.Flavor, recoverGTIDSetStr) - c.Assert(err, check.IsNil) - c.Assert(latestGTIDs.Equal(recoverGTIDSet), check.IsTrue) // verifyMetadata is not enough + require.NoError(t, err) + require.True(t, latestGTIDs.Equal(recoverGTIDSet)) // verifyMetadata is not enough // no relay log file need to recover - c.Assert(r.SaveMeta(minCheckpoint, latestGTIDs), check.IsNil) - c.Assert(r.tryRecoverLatestFile(context.Background(), parser2), check.IsNil) + require.Nil(t, r.SaveMeta(minCheckpoint, latestGTIDs)) + require.Nil(t, r.tryRecoverLatestFile(context.Background(), parser2)) _, latestPos = r.meta.Pos() - c.Assert(latestPos, check.DeepEquals, minCheckpoint) + require.Equal(t, minCheckpoint, latestPos) _, latestGTIDs = r.meta.GTID() - c.Assert(latestGTIDs.Contain(g.LatestGTID), check.IsTrue) + require.True(t, latestGTIDs.Contain(g.LatestGTID)) } -func (t *testRelaySuite) TestTryRecoverMeta(c *check.C) { +func TestTryRecoverMeta(t *testing.T) { var ( uuid = "24ecd093-8cec-11e9-aa0d-0242ac170002" previousGTIDSetStr = "3ccc475b-2343-11e7-be21-6c0b84d59f30:1-14,53bfca22-690d-11e7-8a62-18ded7a37b78:1-495,406a3f61-690d-11e7-87c5-6c92bf46f384:123-456" @@ -251,64 +243,64 @@ func (t *testRelaySuite) TestTryRecoverMeta(c *check.C) { startPos = gmysql.Position{Name: filename, Pos: 123} parser2 = parser.New() - relayCfg = newRelayCfg(c, gmysql.MySQLFlavor) + relayCfg = newRelayCfg(t, gmysql.MySQLFlavor) r = NewRelay(relayCfg).(*Relay) ) cfg := getDBConfigForTest() - conn.InitMockDB(c) + conn.InitMockDB(t) db, err := conn.GetUpstreamDB(cfg) - c.Assert(err, check.IsNil) + require.NoError(t, err) r.db = db - c.Assert(r.Init(context.Background()), check.IsNil) + require.NoError(t, r.Init(context.Background())) recoverGTIDSet, err := gtid.ParserGTID(relayCfg.Flavor, recoverGTIDSetStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) - c.Assert(r.meta.AddDir(uuid, &startPos, nil, 0), check.IsNil) - c.Assert(r.meta.Load(), check.IsNil) + require.Nil(t, r.meta.AddDir(uuid, &startPos, nil, 0)) + require.NoError(t, r.meta.Load()) // use a generator to generate some binlog events previousGTIDSet, err := gtid.ParserGTID(relayCfg.Flavor, previousGTIDSetStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) latestGTID1, err := gtid.ParserGTID(relayCfg.Flavor, latestGTIDStr1) - c.Assert(err, check.IsNil) + require.NoError(t, err) latestGTID2, err := gtid.ParserGTID(relayCfg.Flavor, latestGTIDStr2) - c.Assert(err, check.IsNil) - g, _, data := genBinlogEventsWithGTIDs(c, relayCfg.Flavor, previousGTIDSet, latestGTID1, latestGTID2) + require.NoError(t, err) + g, _, data := genBinlogEventsWithGTIDs(t, relayCfg.Flavor, previousGTIDSet, latestGTID1, latestGTID2) // write events into relay log file err = os.WriteFile(filepath.Join(r.meta.Dir(), filename), data, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) // write some invalid data into the relay log file to trigger a recover. f, err := os.OpenFile(filepath.Join(r.meta.Dir(), filename), os.O_WRONLY|os.O_APPEND, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, err = f.Write([]byte("invalid event data")) - c.Assert(err, check.IsNil) + require.NoError(t, err) f.Close() // recover with empty GTIDs. - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/conn/GetGTIDPurged", `return("")`), check.IsNil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/conn/GetGTIDPurged", `return("")`)) //nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/pkg/conn/GetGTIDPurged") - c.Assert(r.tryRecoverLatestFile(context.Background(), parser2), check.IsNil) + require.Nil(t, r.tryRecoverLatestFile(context.Background(), parser2)) _, latestPos := r.meta.Pos() - c.Assert(latestPos, check.DeepEquals, gmysql.Position{Name: filename, Pos: g.LatestPos}) + require.Equal(t, gmysql.Position{Name: filename, Pos: g.LatestPos}, latestPos) _, latestGTIDs := r.meta.GTID() - c.Assert(latestGTIDs.Equal(recoverGTIDSet), check.IsTrue) + require.True(t, latestGTIDs.Equal(recoverGTIDSet)) // write some invalid data into the relay log file again. f, err = os.OpenFile(filepath.Join(r.meta.Dir(), filename), os.O_WRONLY|os.O_APPEND, 0o600) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, err = f.Write([]byte("invalid event data")) - c.Assert(err, check.IsNil) + require.NoError(t, err) f.Close() // recover with the subset of GTIDs (previous GTID set). - c.Assert(r.SaveMeta(startPos, previousGTIDSet), check.IsNil) - c.Assert(r.tryRecoverLatestFile(context.Background(), parser2), check.IsNil) + require.Nil(t, r.SaveMeta(startPos, previousGTIDSet)) + require.Nil(t, r.tryRecoverLatestFile(context.Background(), parser2)) _, latestPos = r.meta.Pos() - c.Assert(latestPos, check.DeepEquals, gmysql.Position{Name: filename, Pos: g.LatestPos}) + require.Equal(t, gmysql.Position{Name: filename, Pos: g.LatestPos}, latestPos) _, latestGTIDs = r.meta.GTID() - c.Assert(latestGTIDs.Equal(recoverGTIDSet), check.IsTrue) + require.True(t, latestGTIDs.Equal(recoverGTIDSet)) } type dummyListener bool @@ -317,27 +309,27 @@ func (d *dummyListener) OnEvent(e *replication.BinlogEvent) { *d = true } -func (t *testRelaySuite) TestListener(c *check.C) { +func TestListener(t *testing.T) { relay := NewRelay(&Config{}).(*Relay) - c.Assert(len(relay.listeners), check.Equals, 0) + require.Equal(t, 0, len(relay.listeners)) lis := dummyListener(false) relay.RegisterListener(&lis) - c.Assert(len(relay.listeners), check.Equals, 1) + require.Equal(t, 1, len(relay.listeners)) relay.notify(nil) - c.Assert(bool(lis), check.Equals, true) + require.Equal(t, true, bool(lis)) relay.UnRegisterListener(&lis) - c.Assert(len(relay.listeners), check.Equals, 0) + require.Equal(t, 0, len(relay.listeners)) lis = false relay.notify(nil) - c.Assert(bool(lis), check.Equals, false) + require.Equal(t, false, bool(lis)) } // genBinlogEventsWithGTIDs generates some binlog events used by testFileUtilSuite and testFileWriterSuite. // now, its generated events including 3 DDL and 10 DML. -func genBinlogEventsWithGTIDs(c *check.C, flavor string, previousGTIDSet, latestGTID1, latestGTID2 gmysql.GTIDSet) (*event.Generator, []*replication.BinlogEvent, []byte) { +func genBinlogEventsWithGTIDs(t *testing.T, flavor string, previousGTIDSet, latestGTID1, latestGTID2 gmysql.GTIDSet) (*event.Generator, []*replication.BinlogEvent, []byte) { var ( serverID uint32 = 11 latestPos uint32 @@ -349,11 +341,11 @@ func genBinlogEventsWithGTIDs(c *check.C, flavor string, previousGTIDSet, latest // use a binlog event generator to generate some binlog events. g, err := event.NewGenerator(flavor, serverID, latestPos, latestGTID1, previousGTIDSet, latestXID) - c.Assert(err, check.IsNil) + require.NoError(t, err) // file header with FormatDescriptionEvent and PreviousGTIDsEvent events, data, err := g.GenFileHeader(0) - c.Assert(err, check.IsNil) + require.NoError(t, err) allEvents = append(allEvents, events...) allData.Write(data) @@ -366,7 +358,7 @@ func genBinlogEventsWithGTIDs(c *check.C, flavor string, previousGTIDSet, latest } for _, query := range queries { events, data, err = g.GenDDLEvents("db", query, 0) - c.Assert(err, check.IsNil) + require.NoError(t, err) allEvents = append(allEvents, events...) allData.Write(data) } @@ -393,7 +385,7 @@ func genBinlogEventsWithGTIDs(c *check.C, flavor string, previousGTIDSet, latest }, } events, data, err = g.GenDMLEvents(eventType, dmlData, 0) - c.Assert(err, check.IsNil) + require.NoError(t, err) allEvents = append(allEvents, events...) allData.Write(data) } @@ -401,13 +393,13 @@ func genBinlogEventsWithGTIDs(c *check.C, flavor string, previousGTIDSet, latest return g, allEvents, allData.Bytes() } -func (t *testRelaySuite) TestHandleEvent(c *check.C) { +func TestHandleEvent(t *testing.T) { // NOTE: we can test metrics later. var ( reader2 = &mockReader{} parser2 = parser.New() writer2 = &mockWriter{} - relayCfg = newRelayCfg(c, gmysql.MariaDBFlavor) + relayCfg = newRelayCfg(t, gmysql.MariaDBFlavor) r = NewRelay(relayCfg).(*Relay) eventHeader = &replication.EventHeader{ @@ -423,14 +415,14 @@ func (t *testRelaySuite) TestHandleEvent(c *check.C) { r.writer = writer2 cfg := getDBConfigForTest() - conn.InitMockDB(c) + conn.InitMockDB(t) db, err := conn.GetUpstreamDB(cfg) - c.Assert(err, check.IsNil) + require.NoError(t, err) r.db = db - c.Assert(r.Init(context.Background()), check.IsNil) + require.NoError(t, r.Init(context.Background())) // NOTE: we can mock meta later. - c.Assert(r.meta.Load(), check.IsNil) - c.Assert(r.meta.AddDir("24ecd093-8cec-11e9-aa0d-0242ac170002", nil, nil, 0), check.IsNil) + require.NoError(t, r.meta.Load()) + require.Nil(t, r.meta.AddDir("24ecd093-8cec-11e9-aa0d-0242ac170002", nil, nil, 0)) // attach GTID sets to QueryEv queryEv2 := queryEv.Event.(*replication.QueryEvent) @@ -444,7 +436,7 @@ func (t *testRelaySuite) TestHandleEvent(c *check.C) { replication.ErrNeedSyncAgain, } { handleErr := r.handleEvents(context.Background(), reader2, parser2) - c.Assert(errors.Cause(handleErr), check.Equals, reader2.err) + require.Equal(t, reader2.err, errors.Cause(handleErr)) } // reader return fake rotate event @@ -454,26 +446,26 @@ func (t *testRelaySuite) TestHandleEvent(c *check.C) { writer2.err = errors.New("writer error for testing") // return with the annotated writer error err = r.handleEvents(context.Background(), reader2, parser2) - c.Assert(errors.Cause(err), check.Equals, writer2.err) + require.Equal(t, writer2.err, errors.Cause(err)) // after handle rotate event, we save and flush the meta immediately - c.Assert(r.meta.Dirty(), check.Equals, false) + require.Equal(t, false, r.meta.Dirty()) { lm := r.meta.(*LocalMeta) - c.Assert(lm.BinLogName, check.Equals, "mysql-bin.666888") - c.Assert(lm.BinLogPos, check.Equals, uint32(1234)) + require.Equal(t, "mysql-bin.666888", lm.BinLogName) + require.Equal(t, uint32(1234), lm.BinLogPos) filename := filepath.Join(lm.baseDir, lm.currentSubDir, utils.MetaFilename) lm2 := &LocalMeta{} _, err2 := toml.DecodeFile(filename, lm2) - c.Assert(err2, check.IsNil) - c.Assert(lm2.BinLogName, check.Equals, "mysql-bin.666888") - c.Assert(lm2.BinLogPos, check.Equals, uint32(1234)) + require.Nil(t, err2) + require.Equal(t, "mysql-bin.666888", lm2.BinLogName) + require.Equal(t, uint32(1234), lm2.BinLogPos) } { lm := r.meta.(*LocalMeta) backupUUID := lm.currentSubDir lm.currentSubDir = "not exist" err = r.handleEvents(context.Background(), reader2, parser2) - c.Assert(os.IsNotExist(errors.Cause(err)), check.Equals, true) + require.Equal(t, true, os.IsNotExist(errors.Cause(err))) lm.currentSubDir = backupUUID } @@ -485,22 +477,22 @@ func (t *testRelaySuite) TestHandleEvent(c *check.C) { writer2.err = errors.New("writer error for testing") // return with the annotated writer error err = r.handleEvents(context.Background(), reader2, parser2) - c.Assert(errors.Cause(err), check.Equals, writer2.err) - c.Assert(r.meta.Dirty(), check.Equals, false) + require.Equal(t, writer2.err, errors.Cause(err)) + require.Equal(t, false, r.meta.Dirty()) // writer without error ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond) defer cancel() writer2.err = nil err = r.handleEvents(ctx, reader2, parser2) // returned when ctx timeout - c.Assert(errors.Cause(err), check.Equals, ctx.Err()) + require.Equal(t, ctx.Err(), errors.Cause(err)) // check written event - c.Assert(writer2.latestEvent, check.Equals, reader2.result.Event) + require.Equal(t, reader2.result.Event, writer2.latestEvent) // check meta _, pos := r.meta.Pos() _, gs := r.meta.GTID() - c.Assert(pos, check.DeepEquals, binlogPos) - c.Assert(gs.String(), check.Equals, "") // no GTID sets in event yet + require.Equal(t, binlogPos, pos) + require.Equal(t, "", gs.String()) // no GTID sets in event yet ctx2, cancel2 := context.WithTimeout(context.Background(), 10*time.Millisecond) defer cancel2() @@ -508,15 +500,15 @@ func (t *testRelaySuite) TestHandleEvent(c *check.C) { // write a QueryEvent with GTID sets reader2.result.Event = queryEv err = r.handleEvents(ctx2, reader2, parser2) - c.Assert(errors.Cause(err), check.Equals, ctx.Err()) + require.Equal(t, ctx.Err(), errors.Cause(err)) // check written event - c.Assert(writer2.latestEvent, check.Equals, reader2.result.Event) + require.Equal(t, reader2.result.Event, writer2.latestEvent) // check meta _, pos = r.meta.Pos() _, gs = r.meta.GTID() - c.Assert(pos.Name, check.Equals, binlogPos.Name) - c.Assert(pos.Pos, check.Equals, queryEv.Header.LogPos) - c.Assert(gs, check.DeepEquals, queryEv2.GSet) // got GTID sets + require.Equal(t, binlogPos.Name, pos.Name) + require.Equal(t, queryEv.Header.LogPos, pos.Pos) + require.Equal(t, queryEv2.GSet, gs) // got GTID sets // transformer return ignorable for the event reader2.err = nil @@ -527,11 +519,11 @@ func (t *testRelaySuite) TestHandleEvent(c *check.C) { ctx4, cancel4 := context.WithTimeout(context.Background(), 10*time.Millisecond) defer cancel4() err = r.handleEvents(ctx4, reader2, parser2) - c.Assert(errors.Cause(err), check.Equals, ctx.Err()) + require.Equal(t, ctx.Err(), errors.Cause(err)) select { case <-ctx4.Done(): default: - c.Fatalf("ignorable event for transformer not ignored") + t.Fatalf("ignorable event for transformer not ignored") } // writer return ignorable for the event @@ -540,32 +532,32 @@ func (t *testRelaySuite) TestHandleEvent(c *check.C) { ctx5, cancel5 := context.WithTimeout(context.Background(), 10*time.Millisecond) defer cancel5() err = r.handleEvents(ctx5, reader2, parser2) - c.Assert(errors.Cause(err), check.Equals, ctx.Err()) + require.Equal(t, ctx.Err(), errors.Cause(err)) select { case <-ctx5.Done(): default: - c.Fatalf("ignorable event for writer not ignored") + t.Fatalf("ignorable event for writer not ignored") } } -func (t *testRelaySuite) TestReSetupMeta(c *check.C) { +func TestReSetupMeta(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), conn.DefaultDBTimeout) defer cancel() var ( - relayCfg = newRelayCfg(c, gmysql.MySQLFlavor) + relayCfg = newRelayCfg(t, gmysql.MySQLFlavor) r = NewRelay(relayCfg).(*Relay) ) cfg := getDBConfigForTest() - mockDB := conn.InitMockDB(c) + mockDB := conn.InitMockDB(t) db, err := conn.GetUpstreamDB(cfg) - c.Assert(err, check.IsNil) + require.NoError(t, err) r.db = db - c.Assert(r.Init(context.Background()), check.IsNil) + require.NoError(t, r.Init(context.Background())) // empty metadata - c.Assert(r.meta.Load(), check.IsNil) - t.verifyMetadata(c, r, "", minCheckpoint, "", nil) + require.NoError(t, r.meta.Load()) + verifyMetadata(t, r, "", minCheckpoint, "", nil) // open connected DB and get its UUID defer func() { @@ -574,36 +566,36 @@ func (t *testRelaySuite) TestReSetupMeta(c *check.C) { }() mockGetServerUUID(mockDB) uuid, err := conn.GetServerUUID(tcontext.NewContext(ctx, log.L()), r.db, r.cfg.Flavor) - c.Assert(err, check.IsNil) + require.NoError(t, err) // re-setup meta with start pos adjusted r.cfg.EnableGTID = true r.cfg.BinlogGTID = "24ecd093-8cec-11e9-aa0d-0242ac170002:1-23" r.cfg.BinLogName = "mysql-bin.000005" - c.Assert(r.setSyncConfig(), check.IsNil) + require.NoError(t, r.setSyncConfig()) // all adjusted gset should be empty since we didn't flush logs emptyGTID, err := gtid.ParserGTID(r.cfg.Flavor, "") - c.Assert(err, check.IsNil) + require.NoError(t, err) mockGetServerUUID(mockDB) mockGetRandomServerID(mockDB) // mock AddGSetWithPurged mockDB.ExpectQuery("select @@GLOBAL.gtid_purged").WillReturnRows(sqlmock.NewRows([]string{"@@GLOBAL.gtid_purged"}).AddRow("")) - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/binlog/reader/MockGetEmptyPreviousGTIDFromGTIDSet", "return()"), check.IsNil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/binlog/reader/MockGetEmptyPreviousGTIDFromGTIDSet", "return()")) //nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/pkg/binlog/reader/MockGetEmptyPreviousGTIDFromGTIDSet") - c.Assert(r.reSetupMeta(ctx), check.IsNil) + require.NoError(t, r.reSetupMeta(ctx)) uuid001 := fmt.Sprintf("%s.000001", uuid) - t.verifyMetadata(c, r, uuid001, gmysql.Position{Name: r.cfg.BinLogName, Pos: 4}, emptyGTID.String(), []string{uuid001}) + verifyMetadata(t, r, uuid001, gmysql.Position{Name: r.cfg.BinLogName, Pos: 4}, emptyGTID.String(), []string{uuid001}) // re-setup meta again, often happen when connecting a server behind a VIP. mockGetServerUUID(mockDB) mockGetRandomServerID(mockDB) mockDB.ExpectQuery("select @@GLOBAL.gtid_purged").WillReturnRows(sqlmock.NewRows([]string{"@@GLOBAL.gtid_purged"}).AddRow("")) - c.Assert(r.reSetupMeta(ctx), check.IsNil) + require.NoError(t, r.reSetupMeta(ctx)) uuid002 := fmt.Sprintf("%s.000002", uuid) - t.verifyMetadata(c, r, uuid002, minCheckpoint, emptyGTID.String(), []string{uuid001, uuid002}) + verifyMetadata(t, r, uuid002, minCheckpoint, emptyGTID.String(), []string{uuid001, uuid002}) r.cfg.BinLogName = "mysql-bin.000002" r.cfg.BinlogGTID = "24ecd093-8cec-11e9-aa0d-0242ac170002:1-50,24ecd093-8cec-11e9-aa0d-0242ac170003:1-50" @@ -611,37 +603,37 @@ func (t *testRelaySuite) TestReSetupMeta(c *check.C) { mockGetServerUUID(mockDB) mockGetRandomServerID(mockDB) mockDB.ExpectQuery("select @@GLOBAL.gtid_purged").WillReturnRows(sqlmock.NewRows([]string{"@@GLOBAL.gtid_purged"}).AddRow("")) - c.Assert(r.reSetupMeta(ctx), check.IsNil) - t.verifyMetadata(c, r, uuid002, gmysql.Position{Name: r.cfg.BinLogName, Pos: 4}, emptyGTID.String(), []string{uuid002}) + require.NoError(t, r.reSetupMeta(ctx)) + verifyMetadata(t, r, uuid002, gmysql.Position{Name: r.cfg.BinLogName, Pos: 4}, emptyGTID.String(), []string{uuid002}) // re-setup meta again, often happen when connecting a server behind a VIP. mockGetServerUUID(mockDB) mockGetRandomServerID(mockDB) mockDB.ExpectQuery("select @@GLOBAL.gtid_purged").WillReturnRows(sqlmock.NewRows([]string{"@@GLOBAL.gtid_purged"}).AddRow("")) - c.Assert(r.reSetupMeta(ctx), check.IsNil) + require.NoError(t, r.reSetupMeta(ctx)) uuid003 := fmt.Sprintf("%s.000003", uuid) - t.verifyMetadata(c, r, uuid003, minCheckpoint, emptyGTID.String(), []string{uuid002, uuid003}) - c.Assert(mockDB.ExpectationsWereMet(), check.IsNil) + verifyMetadata(t, r, uuid003, minCheckpoint, emptyGTID.String(), []string{uuid002, uuid003}) + require.NoError(t, mockDB.ExpectationsWereMet()) } -func (t *testRelaySuite) verifyMetadata(c *check.C, r *Relay, uuidExpected string, +func verifyMetadata(t *testing.T, r *Relay, uuidExpected string, posExpected gmysql.Position, gsStrExpected string, uuidsExpected []string, ) { uuid, pos := r.meta.Pos() _, gs := r.meta.GTID() gsExpected, err := gtid.ParserGTID(gmysql.MySQLFlavor, gsStrExpected) - c.Assert(err, check.IsNil) - c.Assert(uuid, check.Equals, uuidExpected) - c.Assert(pos, check.DeepEquals, posExpected) - c.Assert(gs.Equal(gsExpected), check.IsTrue) + require.NoError(t, err) + require.Equal(t, uuidExpected, uuid) + require.Equal(t, posExpected, pos) + require.True(t, gs.Equal(gsExpected)) indexFile := filepath.Join(r.cfg.RelayDir, utils.UUIDIndexFilename) UUIDs, err := utils.ParseUUIDIndex(indexFile) - c.Assert(err, check.IsNil) - c.Assert(UUIDs, check.DeepEquals, uuidsExpected) + require.NoError(t, err) + require.Equal(t, uuidsExpected, UUIDs) } -func (t *testRelaySuite) TestPreprocessEvent(c *check.C) { +func TestPreprocessEvent(t *testing.T) { type Case struct { event *replication.BinlogEvent result preprocessResult @@ -665,7 +657,7 @@ func (t *testRelaySuite) TestPreprocessEvent(c *check.C) { nextLogName := "mysql-bin.000123" position := uint64(4) ev, err := event.GenRotateEvent(header, latestPos, []byte(nextLogName), position) - c.Assert(err, check.IsNil) + require.NoError(t, err) cases = append(cases, Case{ event: ev, result: preprocessResult{ @@ -677,7 +669,7 @@ func (t *testRelaySuite) TestPreprocessEvent(c *check.C) { // fake RotateEvent with zero timestamp header.Timestamp = 0 ev, err = event.GenRotateEvent(header, latestPos, []byte(nextLogName), position) - c.Assert(err, check.IsNil) + require.NoError(t, err) cases = append(cases, Case{ event: ev, result: preprocessResult{ @@ -690,7 +682,7 @@ func (t *testRelaySuite) TestPreprocessEvent(c *check.C) { // fake RotateEvent with zero logPos fakeRotateHeader := *header ev, err = event.GenRotateEvent(&fakeRotateHeader, latestPos, []byte(nextLogName), position) - c.Assert(err, check.IsNil) + require.NoError(t, err) ev.Header.LogPos = 0 // set to zero cases = append(cases, Case{ event: ev, @@ -703,7 +695,7 @@ func (t *testRelaySuite) TestPreprocessEvent(c *check.C) { // QueryEvent for DDL query := []byte("CREATE TABLE test_tbl (c1 INT)") ev, err = event.GenQueryEvent(header, latestPos, 0, 0, 0, nil, schema, query) - c.Assert(err, check.IsNil) + require.NoError(t, err) ev.Event.(*replication.QueryEvent).GSet = gtidSet // set GTIDs manually cases = append(cases, Case{ event: ev, @@ -717,7 +709,7 @@ func (t *testRelaySuite) TestPreprocessEvent(c *check.C) { // QueryEvent for non-DDL query = []byte("BEGIN") ev, err = event.GenQueryEvent(header, latestPos, 0, 0, 0, nil, schema, query) - c.Assert(err, check.IsNil) + require.NoError(t, err) cases = append(cases, Case{ event: ev, result: preprocessResult{ @@ -728,7 +720,7 @@ func (t *testRelaySuite) TestPreprocessEvent(c *check.C) { // XIDEvent xid := uint64(135) ev, err = event.GenXIDEvent(header, latestPos, xid) - c.Assert(err, check.IsNil) + require.NoError(t, err) ev.Event.(*replication.XIDEvent).GSet = gtidSet // set GTIDs manually cases = append(cases, Case{ event: ev, @@ -763,7 +755,7 @@ func (t *testRelaySuite) TestPreprocessEvent(c *check.C) { // other event type without LOG_EVENT_ARTIFICIAL_F ev, err = event.GenCommonGTIDEvent(gmysql.MySQLFlavor, header.ServerID, latestPos, gtidSet, false, 0) - c.Assert(err, check.IsNil) + require.NoError(t, err) cases = append(cases, Case{ event: ev, result: preprocessResult{ @@ -773,7 +765,7 @@ func (t *testRelaySuite) TestPreprocessEvent(c *check.C) { // other event type with LOG_EVENT_ARTIFICIAL_F ev, err = event.GenTableMapEvent(header, latestPos, 0, []byte("testdb"), []byte("testtbl"), []byte("INT")) - c.Assert(err, check.IsNil) + require.NoError(t, err) ev.Header.Flags |= replication.LOG_EVENT_ARTIFICIAL_F cases = append(cases, Case{ event: ev, @@ -785,13 +777,13 @@ func (t *testRelaySuite) TestPreprocessEvent(c *check.C) { }) for _, cs := range cases { - c.Assert(relay.preprocessEvent(cs.event, parser2), check.DeepEquals, cs.result) + require.Equal(t, cs.result, relay.preprocessEvent(cs.event, parser2)) } } -func (t *testRelaySuite) TestRecoverMySQL(c *check.C) { +func TestRecoverMySQL(t *testing.T) { var ( - relayDir = c.MkDir() + relayDir = t.TempDir() filename = "test-mysql-bin.000001" parser2 = parser.New() flavor = gmysql.MySQLFlavor @@ -804,147 +796,147 @@ func (t *testRelaySuite) TestRecoverMySQL(c *check.C) { // different SIDs in GTID set previousGTIDSet, err := gtid.ParserGTID(flavor, previousGTIDSetStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) latestGTID1, err := gtid.ParserGTID(flavor, latestGTIDStr1) - c.Assert(err, check.IsNil) + require.NoError(t, err) latestGTID2, err := gtid.ParserGTID(flavor, latestGTIDStr2) - c.Assert(err, check.IsNil) + require.NoError(t, err) // generate binlog events - g, _, baseData := genBinlogEventsWithGTIDs(c, flavor, previousGTIDSet, latestGTID1, latestGTID2) + g, _, baseData := genBinlogEventsWithGTIDs(t, flavor, previousGTIDSet, latestGTID1, latestGTID2) // expected latest pos/GTID set expectedPos := gmysql.Position{Name: filename, Pos: uint32(len(baseData))} // 3 DDL + 10 DML expectedGTIDsStr := "3ccc475b-2343-11e7-be21-6c0b84d59f30:1-18,53bfca22-690d-11e7-8a62-18ded7a37b78:1-505,406a3f61-690d-11e7-87c5-6c92bf46f384:123-456,686e1ab6-c47e-11e7-a42c-6c92bf46f384:234-567" expectedGTIDs, err := gtid.ParserGTID(flavor, expectedGTIDsStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) // write the events to a file fullName := filepath.Join(relayDir, filename) err = os.WriteFile(fullName, baseData, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) // try recover, but in fact do nothing result, err := r.doRecovering(context.Background(), relayDir, filename, parser2) - c.Assert(err, check.IsNil) - c.Assert(result.Truncated, check.IsFalse) - c.Assert(result.LatestPos, check.DeepEquals, expectedPos) - c.Assert(result.LatestGTIDs, check.DeepEquals, expectedGTIDs) + require.NoError(t, err) + require.False(t, result.Truncated) + require.Equal(t, expectedPos, result.LatestPos) + require.Equal(t, expectedGTIDs, result.LatestGTIDs) // check file size, whether no recovering operation applied fs, err := os.Stat(fullName) - c.Assert(err, check.IsNil) - c.Assert(fs.Size(), check.Equals, int64(len(baseData))) + require.NoError(t, err) + require.Equal(t, int64(len(baseData)), fs.Size()) // generate another transaction, DDL extraEvents, extraData, err := g.GenDDLEvents("db2", "CREATE DATABASE db2", 0) - c.Assert(err, check.IsNil) - c.Assert(extraEvents, check.HasLen, 2) // [GTID, Query] + require.NoError(t, err) + require.Len(t, extraEvents, 2) // [GTID, Query] // write an incomplete event to the file corruptData := extraEvents[0].RawData[:len(extraEvents[0].RawData)-2] f, err := os.OpenFile(fullName, os.O_WRONLY|os.O_APPEND, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, err = f.Write(corruptData) - c.Assert(err, check.IsNil) - c.Assert(f.Close(), check.IsNil) + require.NoError(t, err) + require.NoError(t, f.Close()) // check file size, increased fs, err = os.Stat(fullName) - c.Assert(err, check.IsNil) - c.Assert(fs.Size(), check.Equals, int64(len(baseData)+len(corruptData))) + require.NoError(t, err) + require.Equal(t, int64(len(baseData)+len(corruptData)), fs.Size()) // try recover, truncate the incomplete event result, err = r.doRecovering(context.Background(), relayDir, filename, parser2) - c.Assert(err, check.IsNil) - c.Assert(result.Truncated, check.IsTrue) - c.Assert(result.LatestPos, check.DeepEquals, expectedPos) - c.Assert(result.LatestGTIDs, check.DeepEquals, expectedGTIDs) + require.NoError(t, err) + require.True(t, result.Truncated) + require.Equal(t, expectedPos, result.LatestPos) + require.Equal(t, expectedGTIDs, result.LatestGTIDs) // check file size, truncated fs, err = os.Stat(fullName) - c.Assert(err, check.IsNil) - c.Assert(fs.Size(), check.Equals, int64(len(baseData))) + require.NoError(t, err) + require.Equal(t, int64(len(baseData)), fs.Size()) // write an incomplete transaction f, err = os.OpenFile(fullName, os.O_WRONLY|os.O_APPEND, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) var extraLen int64 for i := 0; i < len(extraEvents)-1; i++ { _, err = f.Write(extraEvents[i].RawData) - c.Assert(err, check.IsNil) + require.NoError(t, err) extraLen += int64(len(extraEvents[i].RawData)) } - c.Assert(f.Close(), check.IsNil) + require.NoError(t, f.Close()) // check file size, increased fs, err = os.Stat(fullName) - c.Assert(err, check.IsNil) - c.Assert(fs.Size(), check.Equals, int64(len(baseData))+extraLen) + require.NoError(t, err) + require.Equal(t, int64(len(baseData))+extraLen, fs.Size()) // try recover, truncate the incomplete transaction result, err = r.doRecovering(context.Background(), relayDir, filename, parser2) - c.Assert(err, check.IsNil) - c.Assert(result.Truncated, check.IsTrue) - c.Assert(result.LatestPos, check.DeepEquals, expectedPos) - c.Assert(result.LatestGTIDs, check.DeepEquals, expectedGTIDs) + require.NoError(t, err) + require.True(t, result.Truncated) + require.Equal(t, expectedPos, result.LatestPos) + require.Equal(t, expectedGTIDs, result.LatestGTIDs) // check file size, truncated fs, err = os.Stat(fullName) - c.Assert(err, check.IsNil) - c.Assert(fs.Size(), check.Equals, int64(len(baseData))) + require.NoError(t, err) + require.Equal(t, int64(len(baseData)), fs.Size()) // write an completed transaction f, err = os.OpenFile(fullName, os.O_WRONLY|os.O_APPEND, 0o644) - c.Assert(err, check.IsNil) + require.NoError(t, err) for i := 0; i < len(extraEvents); i++ { _, err = f.Write(extraEvents[i].RawData) - c.Assert(err, check.IsNil) + require.NoError(t, err) } - c.Assert(f.Close(), check.IsNil) + require.NoError(t, f.Close()) // check file size, increased fs, err = os.Stat(fullName) - c.Assert(err, check.IsNil) - c.Assert(fs.Size(), check.Equals, int64(len(baseData)+len(extraData))) + require.NoError(t, err) + require.Equal(t, int64(len(baseData)+len(extraData)), fs.Size()) // try recover, no operation applied expectedPos.Pos += uint32(len(extraData)) // 4 DDL + 10 DML expectedGTIDsStr = "3ccc475b-2343-11e7-be21-6c0b84d59f30:1-18,53bfca22-690d-11e7-8a62-18ded7a37b78:1-506,406a3f61-690d-11e7-87c5-6c92bf46f384:123-456,686e1ab6-c47e-11e7-a42c-6c92bf46f384:234-567" expectedGTIDs, err = gtid.ParserGTID(flavor, expectedGTIDsStr) - c.Assert(err, check.IsNil) + require.NoError(t, err) result, err = r.doRecovering(context.Background(), relayDir, filename, parser2) - c.Assert(err, check.IsNil) - c.Assert(result.Truncated, check.IsFalse) - c.Assert(result.LatestPos, check.DeepEquals, expectedPos) - c.Assert(result.LatestGTIDs, check.DeepEquals, expectedGTIDs) + require.NoError(t, err) + require.False(t, result.Truncated) + require.Equal(t, expectedPos, result.LatestPos) + require.Equal(t, expectedGTIDs, result.LatestGTIDs) // compare file data var allData bytes.Buffer allData.Write(baseData) allData.Write(extraData) fileData, err := os.ReadFile(fullName) - c.Assert(err, check.IsNil) - c.Assert(fileData, check.DeepEquals, allData.Bytes()) + require.NoError(t, err) + require.Equal(t, allData.Bytes(), fileData) } -func (t *testRelaySuite) TestRecoverMySQLNone(c *check.C) { - relayDir := c.MkDir() +func TestRecoverMySQLNone(t *testing.T) { + relayDir := t.TempDir() parser2 := parser.New() r := NewRelay(&Config{Flavor: gmysql.MySQLFlavor}).(*Relay) // no file specified to recover result, err := r.doRecovering(context.Background(), relayDir, "", parser2) - c.Assert(err, check.IsNil) - c.Assert(result.Truncated, check.IsFalse) + require.NoError(t, err) + require.False(t, result.Truncated) filename := "mysql-bin.000001" // file not exist, no need to recover result, err = r.doRecovering(context.Background(), relayDir, filename, parser2) - c.Assert(err, check.IsNil) - c.Assert(result.Truncated, check.IsFalse) + require.NoError(t, err) + require.False(t, result.Truncated) } diff --git a/dm/relay/remote_retry_test.go b/dm/relay/remote_retry_test.go index a0611b132a..3c82d81bc7 100644 --- a/dm/relay/remote_retry_test.go +++ b/dm/relay/remote_retry_test.go @@ -16,25 +16,22 @@ package relay import ( "context" "errors" + "testing" "time" gmysql "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testReaderRetrySuite{}) - -type testReaderRetrySuite struct{} - -func (t *testReaderRetrySuite) TestRetry(c *check.C) { +func TestRetry(t *testing.T) { rr, err := NewReaderRetry(ReaderRetryConfig{ BackoffRollback: 200 * time.Millisecond, BackoffMax: 1 * time.Second, BackoffMin: 1 * time.Millisecond, BackoffFactor: 2, }) - c.Assert(err, check.IsNil) - c.Assert(rr, check.NotNil) + require.NoError(t, err) + require.NotNil(t, rr) retryableErr := gmysql.ErrBadConn unRetryableErr := errors.New("custom error") @@ -42,28 +39,28 @@ func (t *testReaderRetrySuite) TestRetry(c *check.C) { // check some times for i := 0; i < 3; i++ { - c.Assert(rr.Check(ctx, retryableErr), check.IsTrue) + require.True(t, rr.Check(ctx, retryableErr)) } - c.Assert(rr.bf.Current(), check.Equals, 8*time.Millisecond) + require.Equal(t, 8*time.Millisecond, rr.bf.Current()) // check more times, until reach Max for i := 0; i < 10; i++ { - c.Assert(rr.Check(ctx, retryableErr), check.IsTrue) + require.True(t, rr.Check(ctx, retryableErr)) } - c.Assert(rr.bf.Current(), check.Equals, rr.cfg.BackoffMax) + require.Equal(t, rr.cfg.BackoffMax, rr.bf.Current()) // sleep 1s time.Sleep(1 * time.Second) // check with rollback, rollback 5 times, forward 1 time - c.Assert(rr.Check(ctx, retryableErr), check.IsTrue) - c.Assert(rr.bf.Current(), check.Equals, 64*time.Millisecond) + require.True(t, rr.Check(ctx, retryableErr)) + require.Equal(t, 64*time.Millisecond, rr.bf.Current()) // check un-retryable error - c.Assert(rr.Check(ctx, unRetryableErr), check.IsFalse) + require.False(t, rr.Check(ctx, unRetryableErr)) // check with context timeout ctx, cancel := context.WithTimeout(context.Background(), 1*time.Millisecond) defer cancel() - c.Assert(rr.Check(ctx, retryableErr), check.IsFalse) + require.False(t, rr.Check(ctx, retryableErr)) } diff --git a/dm/relay/streamer_test.go b/dm/relay/streamer_test.go index d3825ee33f..e200b31363 100644 --- a/dm/relay/streamer_test.go +++ b/dm/relay/streamer_test.go @@ -15,24 +15,21 @@ package relay import ( "context" + "testing" "time" "github.com/go-mysql-org/go-mysql/replication" - "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tiflow/dm/pkg/binlog/event" "github.com/pingcap/tiflow/dm/pkg/terror" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testStreamerSuite{}) - -type testStreamerSuite struct{} - -func (t *testStreamerSuite) TestStreamer(c *check.C) { - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval", "return(10000)"), check.IsNil) +func TestStreamer(t *testing.T) { + require.NoError(t, failpoint.Enable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval", "return(10000)")) defer func() { - c.Assert(failpoint.Disable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval"), check.IsNil) + require.NoError(t, failpoint.Disable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval")) }() ctx, cancel := context.WithTimeout(context.Background(), time.Second) @@ -44,75 +41,75 @@ func (t *testStreamerSuite) TestStreamer(c *check.C) { ServerID: 11, } ev, err := event.GenFormatDescriptionEvent(header, 4) - c.Assert(err, check.IsNil) + require.NoError(t, err) // 1. get event and error s := newLocalStreamer() // with buffer s.ch <- ev ev2, err := s.GetEvent(ctx) - c.Assert(err, check.IsNil) - c.Assert(ev2, check.DeepEquals, ev) + require.NoError(t, err) + require.Equal(t, ev, ev2) // read error errIn := errors.New("error use for streamer test 1") s.ech <- errIn ev2, err = s.GetEvent(ctx) - c.Assert(err, check.Equals, errIn) - c.Assert(ev2, check.IsNil) + require.Equal(t, errIn, err) + require.Nil(t, ev2) // can not get event anymore because got error ev2, err = s.GetEvent(ctx) - c.Assert(terror.ErrNeedSyncAgain.Equal(err), check.IsTrue) - c.Assert(ev2, check.IsNil) + require.True(t, terror.ErrNeedSyncAgain.Equal(err)) + require.Nil(t, ev2) // 2. close with error s = newLocalStreamer() errClose := errors.New("error use for streamer test 2") s.closeWithError(errClose) ev2, err = s.GetEvent(ctx) - c.Assert(err, check.Equals, errClose) - c.Assert(ev2, check.IsNil) + require.Equal(t, errClose, err) + require.Nil(t, ev2) // can not get event anymore ev2, err = s.GetEvent(ctx) - c.Assert(terror.ErrNeedSyncAgain.Equal(err), check.IsTrue) - c.Assert(ev2, check.IsNil) + require.True(t, terror.ErrNeedSyncAgain.Equal(err)) + require.Nil(t, ev2) // 3. close without error s = newLocalStreamer() s.close() ev2, err = s.GetEvent(ctx) - c.Assert(terror.ErrSyncClosed.Equal(err), check.IsTrue) - c.Assert(ev2, check.IsNil) + require.True(t, terror.ErrSyncClosed.Equal(err)) + require.Nil(t, ev2) // can not get event anymore ev2, err = s.GetEvent(ctx) - c.Assert(terror.ErrNeedSyncAgain.Equal(err), check.IsTrue) - c.Assert(ev2, check.IsNil) + require.True(t, terror.ErrNeedSyncAgain.Equal(err)) + require.Nil(t, ev2) // 4. close with nil error s = newLocalStreamer() s.closeWithError(nil) ev2, err = s.GetEvent(ctx) - c.Assert(terror.ErrSyncClosed.Equal(err), check.IsTrue) - c.Assert(ev2, check.IsNil) + require.True(t, terror.ErrSyncClosed.Equal(err)) + require.Nil(t, ev2) // can not get event anymore ev2, err = s.GetEvent(ctx) - c.Assert(terror.ErrNeedSyncAgain.Equal(err), check.IsTrue) - c.Assert(ev2, check.IsNil) + require.True(t, terror.ErrNeedSyncAgain.Equal(err)) + require.Nil(t, ev2) } -func (t *testStreamerSuite) TestHeartbeat(c *check.C) { - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval", "return(1)"), check.IsNil) +func TestHeartbeat(t *testing.T) { + require.NoError(t, failpoint.Enable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval", "return(1)")) defer func() { - c.Assert(failpoint.Disable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval"), check.IsNil) + require.NoError(t, failpoint.Disable("github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval")) }() ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() s := newLocalStreamer() ev, err := s.GetEvent(ctx) - c.Assert(err, check.IsNil) - c.Assert(ev.Header.EventType, check.Equals, replication.HEARTBEAT_EVENT) + require.NoError(t, err) + require.Equal(t, replication.HEARTBEAT_EVENT, ev.Header.EventType) } diff --git a/dm/relay/upstream_reader_test.go b/dm/relay/upstream_reader_test.go index 022113552e..20fb6eae74 100644 --- a/dm/relay/upstream_reader_test.go +++ b/dm/relay/upstream_reader_test.go @@ -15,19 +15,16 @@ package relay import ( "context" + "testing" "time" "github.com/go-mysql-org/go-mysql/replication" - "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tiflow/dm/pkg/binlog/reader" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testRemoteReaderSuite{}) - -type testRemoteReaderSuite struct{} - -func (t *testRemoteReaderSuite) TestInterface(c *check.C) { +func TestInterface(t *testing.T) { cases := []*replication.BinlogEvent{ {RawData: []byte{1}}, {RawData: []byte{2}}, @@ -43,26 +40,26 @@ func (t *testRemoteReaderSuite) TestInterface(c *check.C) { // test with position r := NewUpstreamReader(cfg) - t.testInterfaceWithReader(c, r, cases) + testInterfaceWithReader(t, r, cases) // test with GTID cfg.EnableGTID = true r = NewUpstreamReader(cfg) - t.testInterfaceWithReader(c, r, cases) + testInterfaceWithReader(t, r, cases) } -func (t *testRemoteReaderSuite) testInterfaceWithReader(c *check.C, r Reader, cases []*replication.BinlogEvent) { +func testInterfaceWithReader(t *testing.T, r Reader, cases []*replication.BinlogEvent) { // replace underlying reader with a mock reader for testing concreteR := r.(*upstreamReader) - c.Assert(concreteR, check.NotNil) + require.NotNil(t, concreteR) mockR := reader.NewMockReader() concreteR.in = mockR // start reader err := r.Start() - c.Assert(err, check.IsNil) + require.NoError(t, err) err = r.Start() // call multi times - c.Assert(err, check.NotNil) + require.Error(t, err) // getEvent by pushing event to mock reader ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) @@ -70,33 +67,33 @@ func (t *testRemoteReaderSuite) testInterfaceWithReader(c *check.C, r Reader, ca concreteMR := mockR.(*reader.MockReader) go func() { for _, cs := range cases { - c.Assert(concreteMR.PushEvent(ctx, cs), check.IsNil) + require.NoError(t, concreteMR.PushEvent(ctx, cs)) } }() obtained := make([]*replication.BinlogEvent, 0, len(cases)) for { result, err2 := r.GetEvent(ctx) - c.Assert(err2, check.IsNil) + require.Nil(t, err2) obtained = append(obtained, result.Event) if len(obtained) == len(cases) { break } } - c.Assert(obtained, check.DeepEquals, cases) + require.Equal(t, cases, obtained) // close reader err = r.Close() - c.Assert(err, check.IsNil) + require.NoError(t, err) err = r.Close() - c.Assert(err, check.NotNil) // call multi times + require.Error(t, err) // call multi times // getEvent from a closed reader result, err := r.GetEvent(ctx) - c.Assert(err, check.NotNil) - c.Assert(result.Event, check.IsNil) + require.Error(t, err) + require.Nil(t, result.Event) } -func (t *testRemoteReaderSuite) TestGetEventWithError(c *check.C) { +func TestGetEventWithError(t *testing.T) { cfg := &RConfig{ SyncConfig: replication.BinlogSyncerConfig{ ServerID: 101, @@ -107,7 +104,7 @@ func (t *testRemoteReaderSuite) TestGetEventWithError(c *check.C) { r := NewUpstreamReader(cfg) // replace underlying reader with a mock reader for testing concreteR := r.(*upstreamReader) - c.Assert(concreteR, check.NotNil) + require.NotNil(t, concreteR) mockR := reader.NewMockReader() concreteR.in = mockR @@ -122,7 +119,7 @@ func (t *testRemoteReaderSuite) TestGetEventWithError(c *check.C) { } err := r.Start() - c.Assert(err, check.IsNil) + require.NoError(t, err) // getEvent by pushing event to mock reader ctx, cancel := context.WithCancel(context.Background()) @@ -130,18 +127,18 @@ func (t *testRemoteReaderSuite) TestGetEventWithError(c *check.C) { concreteMR := mockR.(*reader.MockReader) go func() { for _, cs := range in { - c.Assert(concreteMR.PushError(ctx, cs), check.IsNil) + require.NoError(t, concreteMR.PushError(ctx, cs)) } }() results := make([]error, 0, len(expected)) for { _, err2 := r.GetEvent(ctx) - c.Assert(err2, check.NotNil) + require.NotNil(t, err2) results = append(results, errors.Cause(err2)) if err2 == errOther { break // all received } } - c.Assert(results, check.DeepEquals, expected) + require.Equal(t, expected, results) } diff --git a/dm/relay/util_test.go b/dm/relay/util_test.go index fe829118fc..e9228afb2d 100644 --- a/dm/relay/util_test.go +++ b/dm/relay/util_test.go @@ -17,50 +17,47 @@ import ( "context" "fmt" "io" + "testing" "github.com/DATA-DOG/go-sqlmock" gmysql "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tiflow/dm/pkg/conn" tcontext "github.com/pingcap/tiflow/dm/pkg/context" "github.com/pingcap/tiflow/dm/pkg/log" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testUtilSuite{}) - -type testUtilSuite struct{} - -func (t *testUtilSuite) TestIsNewServer(c *check.C) { +func TestIsNewServer(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), conn.DefaultDBTimeout) defer cancel() - mockDB := conn.InitMockDB(c) + mockDB := conn.InitMockDB(t) baseDB, err := conn.GetUpstreamDB(getDBConfigForTest()) - c.Assert(err, check.IsNil) + require.NoError(t, err) flavor := gmysql.MySQLFlavor // no prevUUID, is new server. isNew, err := isNewServer(ctx, "", baseDB, flavor) - c.Assert(err, check.IsNil) - c.Assert(isNew, check.IsTrue) + require.NoError(t, err) + require.True(t, isNew) // different server mockGetServerUUID(mockDB) isNew, err = isNewServer(ctx, "not-exists-uuid.000001", baseDB, flavor) - c.Assert(err, check.IsNil) - c.Assert(isNew, check.IsTrue) + require.NoError(t, err) + require.True(t, isNew) // the same server mockGetServerUUID(mockDB) currUUID, err := conn.GetServerUUID(tcontext.NewContext(ctx, log.L()), baseDB, flavor) - c.Assert(err, check.IsNil) + require.NoError(t, err) mockGetServerUUID(mockDB) isNew, err = isNewServer(ctx, fmt.Sprintf("%s.000001", currUUID), baseDB, flavor) - c.Assert(err, check.IsNil) - c.Assert(isNew, check.IsFalse) - c.Assert(mockDB.ExpectationsWereMet(), check.IsNil) + require.NoError(t, err) + require.False(t, isNew) + require.NoError(t, mockDB.ExpectationsWereMet()) } func mockGetServerUUID(mockDB sqlmock.Sqlmock) { @@ -76,7 +73,7 @@ func mockGetRandomServerID(mockDB sqlmock.Sqlmock) { sqlmock.NewRows([]string{"Variable_name", "Value"}).AddRow("server_id", "1")) } -func (t *testUtilSuite) TestGetNextUUID(c *check.C) { +func TestGetNextUUID(t *testing.T) { UUIDs := []string{ "b60868af-5a6f-11e9-9ea3-0242ac160006.000001", "7acfedb5-3008-4fa2-9776-6bac42b025fe.000002", @@ -129,16 +126,17 @@ func (t *testUtilSuite) TestGetNextUUID(c *check.C) { for _, cs := range cases { nu, nus, err := getNextRelaySubDir(cs.currUUID, cs.UUIDs) if len(cs.errMsgReg) > 0 { - c.Assert(err, check.ErrorMatches, cs.errMsgReg) + require.Error(t, err) + require.Regexp(t, cs.errMsgReg, err.Error()) } else { - c.Assert(err, check.IsNil) + require.NoError(t, err) } - c.Assert(nu, check.Equals, cs.nextUUID) - c.Assert(nus, check.Equals, cs.nextUUIDSuffix) + require.Equal(t, cs.nextUUID, nu) + require.Equal(t, cs.nextUUIDSuffix, nus) } } -func (t *testUtilSuite) TestIsIgnorableParseError(c *check.C) { +func TestIsIgnorableParseError(t *testing.T) { cases := []struct { err error ignorable bool @@ -166,6 +164,6 @@ func (t *testUtilSuite) TestIsIgnorableParseError(c *check.C) { } for _, cs := range cases { - c.Assert(isIgnorableParseError(cs.err), check.Equals, cs.ignorable) + require.Equal(t, cs.ignorable, isIgnorableParseError(cs.err)) } } diff --git a/dm/syncer/causality_test.go b/dm/syncer/causality_test.go index db7390c4d3..8e17d891c5 100644 --- a/dm/syncer/causality_test.go +++ b/dm/syncer/causality_test.go @@ -19,7 +19,6 @@ import ( "time" "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" cdcmodel "github.com/pingcap/tiflow/cdc/model" "github.com/pingcap/tiflow/dm/config" "github.com/pingcap/tiflow/dm/pkg/binlog" @@ -31,7 +30,7 @@ import ( "github.com/stretchr/testify/require" ) -func (s *testSyncerSuite) TestDetectConflict(c *check.C) { +func (s *testSyncerSuite) TestDetectConflict() { ca := &causality{ relation: newCausalityRelation(), } @@ -43,25 +42,25 @@ func (s *testSyncerSuite) TestDetectConflict(c *check.C) { } assertRelationsEq := func(expectMap map[string]string) { - c.Assert(ca.relation.len(), check.Equals, len(expectMap)) + s.Require().Equal(len(expectMap), ca.relation.len()) for k, expV := range expectMap { v, ok := ca.relation.get(k) - c.Assert(ok, check.IsTrue) - c.Assert(v, check.Equals, expV) + s.Require().True(ok) + s.Require().Equal(expV, v) } } - c.Assert(ca.detectConflict(caseData), check.IsFalse) + s.Require().False(ca.detectConflict(caseData)) ca.add(caseData) assertRelationsEq(excepted) - c.Assert(ca.detectConflict([]string{"test_4"}), check.IsFalse) + s.Require().False(ca.detectConflict([]string{"test_4"})) ca.add([]string{"test_4"}) excepted["test_4"] = "test_4" assertRelationsEq(excepted) conflictData := []string{"test_4", "test_3"} - c.Assert(ca.detectConflict(conflictData), check.IsTrue) + s.Require().True(ca.detectConflict(conflictData)) ca.relation.clear() - c.Assert(ca.relation.len(), check.Equals, 0) + s.Require().Equal(0, ca.relation.len()) } func TestCausality(t *testing.T) { @@ -127,10 +126,10 @@ func TestCausality(t *testing.T) { } } -func (s *testSyncerSuite) TestCasualityRelation(c *check.C) { +func (s *testSyncerSuite) TestCasualityRelation() { rm := newCausalityRelation() - c.Assert(rm.len(), check.Equals, 0) - c.Assert(len(rm.groups), check.Equals, 1) + s.Require().Equal(0, rm.len()) + s.Require().Equal(1, len(rm.groups)) testCases := []struct { key string @@ -154,17 +153,17 @@ func (s *testSyncerSuite) TestCasualityRelation(c *check.C) { rm.set(testcase.key, testcase.val) } - c.Assert(rm.len(), check.Equals, len(testCases)) + s.Require().Equal(len(testCases), rm.len()) for _, testcase := range testCases { val, ok := rm.get(testcase.key) - c.Assert(ok, check.Equals, true) - c.Assert(val, check.Equals, testcase.val) + s.Require().Equal(true, ok) + s.Require().Equal(testcase.val, val) } rm.rotate(1) rm.gc(1) - c.Assert(rm.len(), check.Equals, 0) + s.Require().Equal(0, rm.len()) // test gc max for _, testcase := range testCases { @@ -172,7 +171,7 @@ func (s *testSyncerSuite) TestCasualityRelation(c *check.C) { } rm.gc(math.MaxInt64) - c.Assert(rm.len(), check.Equals, 0) + s.Require().Equal(0, rm.len()) // test with rotate for index, testcase := range testCases { @@ -180,27 +179,27 @@ func (s *testSyncerSuite) TestCasualityRelation(c *check.C) { rm.rotate(int64(index)) } - c.Assert(rm.len(), check.Equals, len(testCases)) + s.Require().Equal(len(testCases), rm.len()) for _, testcase := range testCases { val, ok := rm.get(testcase.key) - c.Assert(ok, check.Equals, true) - c.Assert(val, check.Equals, testcase.val) + s.Require().Equal(true, ok) + s.Require().Equal(testcase.val, val) } for index := range testCases { rm.gc(int64(index)) for _, rmMap := range rm.groups[1:] { - c.Assert(rmMap.prevFlushJobSeq, check.Not(check.Equals), int64(index)) + s.Require().NotEqual(int64(index), rmMap.prevFlushJobSeq) } for ti := 0; ti < index; ti++ { _, ok := rm.get(testCases[ti].key) - c.Assert(ok, check.Equals, false) + s.Require().Equal(false, ok) } } rm.clear() - c.Assert(rm.len(), check.Equals, 0) + s.Require().Equal(0, rm.len()) } diff --git a/dm/syncer/checkpoint_test.go b/dm/syncer/checkpoint_test.go index 22159d2570..d921a6e08e 100644 --- a/dm/syncer/checkpoint_test.go +++ b/dm/syncer/checkpoint_test.go @@ -24,7 +24,6 @@ import ( "github.com/DATA-DOG/go-sqlmock" "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" "github.com/pingcap/log" tidbddl "github.com/pingcap/tidb/pkg/ddl" "github.com/pingcap/tidb/pkg/meta/metabuild" @@ -42,6 +41,7 @@ import ( "github.com/pingcap/tiflow/dm/pkg/schema" "github.com/pingcap/tiflow/dm/syncer/dbconn" "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "go.uber.org/zap/zapcore" ) @@ -56,15 +56,14 @@ var ( deleteSchemaPointSQL = "" ) -var _ = check.Suite(&testCheckpointSuite{}) - type testCheckpointSuite struct { + suite.Suite cfg *config.SubTaskConfig mock sqlmock.Sqlmock tracker *schema.Tracker } -func (s *testCheckpointSuite) SetUpSuite(c *check.C) { +func (s *testCheckpointSuite) SetupSuite() { s.cfg = &config.SubTaskConfig{ ServerID: 101, MetaSchema: "test", @@ -76,10 +75,10 @@ func (s *testCheckpointSuite) SetUpSuite(c *check.C) { var err error s.tracker, err = schema.NewTestTracker(context.Background(), s.cfg.Name, nil, dlog.L()) - c.Assert(err, check.IsNil) + s.Require().NoError(err) } -func (s *testCheckpointSuite) TestUpTest(c *check.C) { +func (s *testCheckpointSuite) TestUpTest() { s.tracker.Reset() } @@ -94,7 +93,7 @@ func (s *testCheckpointSuite) prepareCheckPointSQL() { } // this test case uses sqlmock to simulate all SQL operations in tests. -func (s *testCheckpointSuite) TestCheckPoint(c *check.C) { +func (s *testCheckpointSuite) TestCheckPoint() { tctx := tcontext.Background() cp := NewRemoteCheckPoint(tctx, s.cfg, nil, cpid) @@ -105,7 +104,7 @@ func (s *testCheckpointSuite) TestCheckPoint(c *check.C) { var err error db, mock, err := sqlmock.New() - c.Assert(err, check.IsNil) + s.Require().NoError(err) s.mock = mock s.prepareCheckPointSQL() @@ -121,33 +120,33 @@ func (s *testCheckpointSuite) TestCheckPoint(c *check.C) { mock.ExpectCommit() dbConn, err := db.Conn(tcontext.Background().Context()) - c.Assert(err, check.IsNil) + s.Require().NoError(err) conn := dbconn.NewDBConn(s.cfg, conn.NewBaseConnForTest(dbConn, &retry.FiniteRetryStrategy{})) cp.(*RemoteCheckPoint).dbConn = conn err = cp.(*RemoteCheckPoint).prepare(tctx) - c.Assert(err, check.IsNil) - c.Assert(cp.Clear(tctx), check.IsNil) + s.Require().NoError(err) + s.Require().Nil(cp.Clear(tctx)) // test operation for global checkpoint - s.testGlobalCheckPoint(c, cp) + s.testGlobalCheckPoint(cp) // test operation for table checkpoint - s.testTableCheckPoint(c, cp) + s.testTableCheckPoint(cp) } -func (s *testCheckpointSuite) testGlobalCheckPoint(c *check.C, cp CheckPoint) { +func (s *testCheckpointSuite) testGlobalCheckPoint(cp CheckPoint) { tctx := tcontext.Background() // global checkpoint init to min - c.Assert(cp.GlobalPoint().Position, check.Equals, binlog.MinPosition) - c.Assert(cp.FlushedGlobalPoint().Position, check.Equals, binlog.MinPosition) + s.Require().Equal(binlog.MinPosition, cp.GlobalPoint().Position) + s.Require().Equal(binlog.MinPosition, cp.FlushedGlobalPoint().Position) // try load, but should load nothing s.mock.ExpectQuery(loadCheckPointSQL).WillReturnRows(sqlmock.NewRows(nil)) err := cp.Load(tctx) - c.Assert(err, check.IsNil) - c.Assert(cp.GlobalPoint().Position, check.Equals, binlog.MinPosition) - c.Assert(cp.FlushedGlobalPoint().Position, check.Equals, binlog.MinPosition) + s.Require().NoError(err) + s.Require().Equal(binlog.MinPosition, cp.GlobalPoint().Position) + s.Require().Equal(binlog.MinPosition, cp.FlushedGlobalPoint().Position) oldMode := s.cfg.Mode oldDir := s.cfg.Dir @@ -163,7 +162,7 @@ func (s *testCheckpointSuite) testGlobalCheckPoint(c *check.C, cp CheckPoint) { s.mock.ExpectQuery(loadCheckPointSQL).WithArgs(cpid).WillReturnRows(sqlmock.NewRows(nil)) err = cp.Load(tctx) - c.Assert(err, check.IsNil) + s.Require().NoError(err) cp.SaveGlobalPoint(binlog.Location{Position: pos1}) s.mock.ExpectBegin() @@ -174,18 +173,18 @@ func (s *testCheckpointSuite) testGlobalCheckPoint(c *check.C, cp CheckPoint) { cp.DiscardPendingSnapshots() snap := cp.Snapshot(true) err = cp.FlushPointsExcept(tctx, snap.id, nil, nil, nil) - c.Assert(err, check.IsNil) - c.Assert(cp.GlobalPoint().Position, check.Equals, pos1) - c.Assert(cp.FlushedGlobalPoint().Position, check.Equals, pos1) + s.Require().NoError(err) + s.Require().Equal(pos1, cp.GlobalPoint().Position) + s.Require().Equal(pos1, cp.FlushedGlobalPoint().Position) // try load from config pos1.Pos = 2044 s.cfg.Mode = config.ModeIncrement s.cfg.Meta = &config.Meta{BinLogName: pos1.Name, BinLogPos: pos1.Pos} err = cp.LoadMeta(tctx.Ctx) - c.Assert(err, check.IsNil) - c.Assert(cp.GlobalPoint().Position, check.Equals, pos1) - c.Assert(cp.FlushedGlobalPoint().Position, check.Equals, pos1) + s.Require().NoError(err) + s.Require().Equal(pos1, cp.GlobalPoint().Position) + s.Require().Equal(pos1, cp.FlushedGlobalPoint().Position) s.cfg.Mode = oldMode s.cfg.Meta = nil @@ -196,28 +195,28 @@ func (s *testCheckpointSuite) testGlobalCheckPoint(c *check.C, cp CheckPoint) { Pos: 2052, } cp.SaveGlobalPoint(binlog.Location{Position: pos2}) - c.Assert(cp.GlobalPoint().Position, check.Equals, pos2) - c.Assert(cp.FlushedGlobalPoint().Position, check.Equals, pos1) + s.Require().Equal(pos2, cp.GlobalPoint().Position) + s.Require().Equal(pos1, cp.FlushedGlobalPoint().Position) // test rollback cp.Rollback() - c.Assert(cp.GlobalPoint().Position, check.Equals, pos1) - c.Assert(cp.FlushedGlobalPoint().Position, check.Equals, pos1) + s.Require().Equal(pos1, cp.GlobalPoint().Position) + s.Require().Equal(pos1, cp.FlushedGlobalPoint().Position) // save again cp.SaveGlobalPoint(binlog.Location{Position: pos2}) - c.Assert(cp.GlobalPoint().Position, check.Equals, pos2) - c.Assert(cp.FlushedGlobalPoint().Position, check.Equals, pos1) + s.Require().Equal(pos2, cp.GlobalPoint().Position) + s.Require().Equal(pos1, cp.FlushedGlobalPoint().Position) // flush + rollback s.mock.ExpectBegin() s.mock.ExpectExec("(202)?"+flushCheckPointSQL).WithArgs(cpid, "", "", pos2.Name, pos2.Pos, "", "", 0, "", "null", true).WillReturnResult(sqlmock.NewResult(0, 1)) s.mock.ExpectCommit() err = cp.FlushPointsExcept(tctx, cp.Snapshot(true).id, nil, nil, nil) - c.Assert(err, check.IsNil) + s.Require().NoError(err) cp.Rollback() - c.Assert(cp.GlobalPoint().Position, check.Equals, pos2) - c.Assert(cp.FlushedGlobalPoint().Position, check.Equals, pos2) + s.Require().Equal(pos2, cp.GlobalPoint().Position) + s.Require().Equal(pos2, cp.FlushedGlobalPoint().Position) // try load from DB pos3 := pos2 @@ -226,16 +225,16 @@ func (s *testCheckpointSuite) testGlobalCheckPoint(c *check.C, cp CheckPoint) { columns := []string{"cp_schema", "cp_table", "binlog_name", "binlog_pos", "binlog_gtid", "exit_safe_binlog_name", "exit_safe_binlog_pos", "exit_safe_binlog_gtid", "table_info", "is_global"} s.mock.ExpectQuery(loadCheckPointSQL).WithArgs(cpid).WillReturnRows(sqlmock.NewRows(columns).AddRow("", "", pos2.Name, pos2.Pos, "", "", 0, "", "null", true)) err = cp.Load(tctx) - c.Assert(err, check.IsNil) - c.Assert(cp.GlobalPoint().Position, check.Equals, pos2) - c.Assert(cp.FlushedGlobalPoint().Position, check.Equals, pos2) + s.Require().NoError(err) + s.Require().Equal(pos2, cp.GlobalPoint().Position) + s.Require().Equal(pos2, cp.FlushedGlobalPoint().Position) // test save older point /*var buf bytes.Buffer log.SetOutput(&buf) cp.SaveGlobalPoint(pos1) - c.Assert(cp.GlobalPoint(), check.Equals, pos2) - c.Assert(cp.FlushedGlobalPoint(), check.Equals, pos2) + s.Require().Equal(pos2, cp.GlobalPoint()) + s.Require().Equal(pos2, cp.FlushedGlobalPoint()) matchStr := fmt.Sprintf(".*try to save %s is older than current pos %s", pos1, pos2) matchStr = strings.Replace(strings.Replace(matchStr, ")", "\\)", -1), "(", "\\(", -1) c.Assert(strings.TrimSpace(buf.String()), Matches, matchStr) @@ -246,43 +245,43 @@ func (s *testCheckpointSuite) testGlobalCheckPoint(c *check.C, cp CheckPoint) { s.mock.ExpectExec(clearCheckPointSQL).WithArgs(cpid).WillReturnResult(sqlmock.NewResult(0, 1)) s.mock.ExpectCommit() err = cp.Clear(tctx) - c.Assert(err, check.IsNil) - c.Assert(cp.GlobalPoint().Position, check.Equals, binlog.MinPosition) - c.Assert(cp.FlushedGlobalPoint().Position, check.Equals, binlog.MinPosition) + s.Require().NoError(err) + s.Require().Equal(binlog.MinPosition, cp.GlobalPoint().Position) + s.Require().Equal(binlog.MinPosition, cp.FlushedGlobalPoint().Position) s.mock.ExpectQuery(loadCheckPointSQL).WillReturnRows(sqlmock.NewRows(nil)) err = cp.Load(tctx) - c.Assert(err, check.IsNil) - c.Assert(cp.GlobalPoint().Position, check.Equals, binlog.MinPosition) - c.Assert(cp.FlushedGlobalPoint().Position, check.Equals, binlog.MinPosition) + s.Require().NoError(err) + s.Require().Equal(binlog.MinPosition, cp.GlobalPoint().Position) + s.Require().Equal(binlog.MinPosition, cp.FlushedGlobalPoint().Position) // try load from mydumper's output - dir := c.MkDir() + dir := s.T().TempDir() filename := filepath.Join(dir, "metadata") err = os.WriteFile(filename, []byte( fmt.Sprintf("SHOW MASTER STATUS:\n\tLog: %s\n\tPos: %d\n\tGTID:\n\nSHOW SLAVE STATUS:\n\tHost: %s\n\tLog: %s\n\tPos: %d\n\tGTID:\n\n", pos1.Name, pos1.Pos, "slave_host", pos1.Name, pos1.Pos+1000)), 0o644) - c.Assert(err, check.IsNil) + s.Require().NoError(err) s.cfg.Mode = config.ModeAll s.cfg.Dir = dir - c.Assert(cp.LoadMeta(tctx.Ctx), check.IsNil) + s.Require().Nil(cp.LoadMeta(tctx.Ctx)) // should flush because checkpoint hasn't been updated before (cp.globalPointCheckOrSaveTime.IsZero() == true). snapshot := cp.Snapshot(true) - c.Assert(snapshot.id, check.Equals, 4) + s.Require().Equal(4, snapshot.id) s.mock.ExpectQuery(loadCheckPointSQL).WillReturnRows(sqlmock.NewRows(nil)) err = cp.Load(tctx) - c.Assert(err, check.IsNil) - c.Assert(cp.GlobalPoint().Position, check.Equals, pos1) - c.Assert(cp.FlushedGlobalPoint().Position, check.Equals, pos1) + s.Require().NoError(err) + s.Require().Equal(pos1, cp.GlobalPoint().Position) + s.Require().Equal(pos1, cp.FlushedGlobalPoint().Position) s.mock.ExpectBegin() s.mock.ExpectExec(clearCheckPointSQL).WithArgs(cpid).WillReturnResult(sqlmock.NewResult(0, 1)) s.mock.ExpectCommit() err = cp.Clear(tctx) - c.Assert(err, check.IsNil) + s.Require().NoError(err) // check dumpling write exitSafeModeLocation in metadata err = os.WriteFile(filename, []byte( @@ -302,31 +301,31 @@ SHOW MASTER STATUS: /* AFTER CONNECTION POOL ESTABLISHED */ Pos: %d GTID: `, pos1.Name, pos1.Pos, "slave_host", pos1.Name, pos1.Pos+1000, pos2.Name, pos2.Pos)), 0o644) - c.Assert(err, check.IsNil) - c.Assert(cp.LoadMeta(tctx.Ctx), check.IsNil) + s.Require().NoError(err) + s.Require().Nil(cp.LoadMeta(tctx.Ctx)) // should flush because exitSafeModeLocation is true snapshot = cp.Snapshot(true) - c.Assert(snapshot, check.NotNil) + s.Require().NotNil(snapshot) s.mock.ExpectBegin() s.mock.ExpectExec("(202)?"+flushCheckPointSQL).WithArgs(cpid, "", "", pos1.Name, pos1.Pos, "", pos2.Name, pos2.Pos, "", "null", true).WillReturnResult(sqlmock.NewResult(0, 1)) s.mock.ExpectCommit() err = cp.FlushPointsExcept(tctx, snapshot.id, nil, nil, nil) - c.Assert(err, check.IsNil) + s.Require().NoError(err) s.mock.ExpectQuery(loadCheckPointSQL).WillReturnRows(sqlmock.NewRows(nil)) err = cp.Load(tctx) - c.Assert(err, check.IsNil) - c.Assert(cp.GlobalPoint().Position, check.Equals, pos1) - c.Assert(cp.FlushedGlobalPoint().Position, check.Equals, pos1) - c.Assert(cp.SafeModeExitPoint().Position, check.Equals, pos2) + s.Require().NoError(err) + s.Require().Equal(pos1, cp.GlobalPoint().Position) + s.Require().Equal(pos1, cp.FlushedGlobalPoint().Position) + s.Require().Equal(pos2, cp.SafeModeExitPoint().Position) // when use async flush, even exitSafeModeLocation is true we won't flush - c.Assert(cp.LoadMeta(tctx.Ctx), check.IsNil) + s.Require().Nil(cp.LoadMeta(tctx.Ctx)) snapshot = cp.Snapshot(false) - c.Assert(snapshot, check.IsNil) + s.Require().Nil(snapshot) } -func (s *testCheckpointSuite) testTableCheckPoint(c *check.C, cp CheckPoint) { +func (s *testCheckpointSuite) testTableCheckPoint(cp CheckPoint) { var ( tctx = tcontext.Background() table = &filter.Table{ @@ -348,67 +347,67 @@ func (s *testCheckpointSuite) testTableCheckPoint(c *check.C, cp CheckPoint) { // not exist older := cp.IsOlderThanTablePoint(table, binlog.Location{Position: pos1}) - c.Assert(older, check.IsFalse) + s.Require().False(older) // save cp.SaveTablePoint(table, binlog.Location{Position: pos2}, nil) older = cp.IsOlderThanTablePoint(table, binlog.Location{Position: pos1}) - c.Assert(older, check.IsTrue) + s.Require().True(older) // rollback, to min cp.Rollback() older = cp.IsOlderThanTablePoint(table, binlog.Location{Position: pos1}) - c.Assert(older, check.IsFalse) + s.Require().False(older) // save again cp.SaveTablePoint(table, binlog.Location{Position: pos2}, nil) older = cp.IsOlderThanTablePoint(table, binlog.Location{Position: pos1}) - c.Assert(older, check.IsTrue) + s.Require().True(older) // flush + rollback s.mock.ExpectBegin() s.mock.ExpectExec("(284)?"+flushCheckPointSQL).WithArgs(cpid, table.Schema, table.Name, pos2.Name, pos2.Pos, "", "", 0, "", sqlmock.AnyArg(), false).WillReturnResult(sqlmock.NewResult(0, 1)) s.mock.ExpectCommit() err = cp.FlushPointsExcept(tctx, cp.Snapshot(true).id, nil, nil, nil) - c.Assert(err, check.IsNil) + s.Require().NoError(err) cp.Rollback() older = cp.IsOlderThanTablePoint(table, binlog.Location{Position: pos1}) - c.Assert(older, check.IsTrue) + s.Require().True(older) // save cp.SaveTablePoint(table, binlog.Location{Position: pos2}, nil) older = cp.IsOlderThanTablePoint(table, binlog.Location{Position: pos1}) - c.Assert(older, check.IsTrue) + s.Require().True(older) // delete s.mock.ExpectBegin() s.mock.ExpectExec(deleteCheckPointSQL).WithArgs(cpid, schemaName, tableName).WillReturnResult(sqlmock.NewResult(0, 1)) s.mock.ExpectCommit() - c.Assert(cp.DeleteTablePoint(tctx, table), check.IsNil) + s.Require().Nil(cp.DeleteTablePoint(tctx, table)) s.mock.ExpectBegin() s.mock.ExpectExec(deleteSchemaPointSQL).WithArgs(cpid, schemaName).WillReturnResult(sqlmock.NewResult(0, 1)) s.mock.ExpectCommit() - c.Assert(cp.DeleteSchemaPoint(tctx, schemaName), check.IsNil) + s.Require().Nil(cp.DeleteSchemaPoint(tctx, schemaName)) ctx := context.Background() // test save with table info and rollback - c.Assert(s.tracker.CreateSchemaIfNotExists(schemaName), check.IsNil) + s.Require().Nil(s.tracker.CreateSchemaIfNotExists(schemaName)) stmt, err := parseSQL("create table " + tableName + " (c int);") - c.Assert(err, check.IsNil) + s.Require().NoError(err) err = s.tracker.Exec(ctx, schemaName, stmt) - c.Assert(err, check.IsNil) + s.Require().NoError(err) ti, err := s.tracker.GetTableInfo(table) - c.Assert(err, check.IsNil) + s.Require().NoError(err) cp.SaveTablePoint(table, binlog.Location{Position: pos1}, ti) rcp := cp.(*RemoteCheckPoint) - c.Assert(rcp.points[schemaName][tableName].TableInfo(), check.NotNil) - c.Assert(rcp.points[schemaName][tableName].flushedPoint.ti, check.IsNil) + s.Require().NotNil(rcp.points[schemaName][tableName].TableInfo()) + s.Require().Nil(rcp.points[schemaName][tableName].flushedPoint.ti) cp.Rollback() rcp = cp.(*RemoteCheckPoint) - c.Assert(rcp.points[schemaName][tableName].TableInfo(), check.IsNil) - c.Assert(rcp.points[schemaName][tableName].flushedPoint.ti, check.IsNil) + s.Require().Nil(rcp.points[schemaName][tableName].TableInfo()) + s.Require().Nil(rcp.points[schemaName][tableName].flushedPoint.ti) // test save, flush and rollback to not nil table info cp.SaveTablePoint(table, binlog.Location{Position: pos1}, ti) @@ -418,15 +417,15 @@ func (s *testCheckpointSuite) testTableCheckPoint(c *check.C, cp CheckPoint) { s.mock.ExpectCommit() lastGlobalPoint := cp.GlobalPoint() lastGlobalPointSavedTime := cp.GlobalPointSaveTime() - c.Assert(cp.FlushPointsExcept(tctx, cp.Snapshot(true).id, nil, nil, nil), check.IsNil) - c.Assert(cp.GlobalPoint(), check.Equals, lastGlobalPoint) - c.Assert(cp.GlobalPointSaveTime(), check.Equals, lastGlobalPointSavedTime) + s.Require().Nil(cp.FlushPointsExcept(tctx, cp.Snapshot(true).id, nil, nil, nil)) + s.Require().Equal(lastGlobalPoint, cp.GlobalPoint()) + s.Require().Equal(lastGlobalPointSavedTime, cp.GlobalPointSaveTime()) stmt, err = parseSQL("alter table " + tableName + " add c2 int;") - c.Assert(err, check.IsNil) + s.Require().NoError(err) err = s.tracker.Exec(ctx, schemaName, stmt) - c.Assert(err, check.IsNil) + s.Require().NoError(err) ti2, err := s.tracker.GetTableInfo(table) - c.Assert(err, check.IsNil) + s.Require().NoError(err) cp.SaveTablePoint(table, binlog.Location{Position: pos2}, ti2) cp.Rollback() @@ -435,16 +434,16 @@ func (s *testCheckpointSuite) testTableCheckPoint(c *check.C, cp CheckPoint) { s.mock.ExpectExec(clearCheckPointSQL).WithArgs(cpid).WillReturnResult(sqlmock.NewResult(0, 1)) s.mock.ExpectCommit() err = cp.Clear(tctx) - c.Assert(err, check.IsNil) + s.Require().NoError(err) older = cp.IsOlderThanTablePoint(table, binlog.Location{Position: pos1}) - c.Assert(older, check.IsFalse) + s.Require().False(older) // test save table point less than global point func() { defer func() { r := recover() matchStr := ".*less than global checkpoint.*" - c.Assert(r, check.Matches, matchStr) + s.Require().Regexp(matchStr, r) }() cp.SaveGlobalPoint(binlog.Location{Position: pos2}) cp.SaveTablePoint(table, binlog.Location{Position: pos1}, nil) @@ -458,17 +457,17 @@ func (s *testCheckpointSuite) testTableCheckPoint(c *check.C, cp CheckPoint) { lastGlobalPointSavedTime = cp.GlobalPointSaveTime() err = cp.FlushPointsExcept(tctx, cp.Snapshot(true).id, []*filter.Table{table}, nil, nil) fmt.Println(cp.GlobalPoint(), lastGlobalPoint) - c.Assert(cp.GlobalPoint(), check.Equals, lastGlobalPoint) - c.Assert(cp.GlobalPointSaveTime(), check.Not(check.Equals), lastGlobalPointSavedTime) - c.Assert(err, check.IsNil) + s.Require().Equal(lastGlobalPoint, cp.GlobalPoint()) + s.Require().NotEqual(lastGlobalPointSavedTime, cp.GlobalPointSaveTime()) + s.Require().NoError(err) cp.Rollback() older = cp.IsOlderThanTablePoint(table, binlog.Location{Position: pos1}) - c.Assert(older, check.IsFalse) + s.Require().False(older) s.mock.ExpectBegin() s.mock.ExpectExec(clearCheckPointSQL).WithArgs(cpid).WillReturnResult(sqlmock.NewResult(0, 1)) s.mock.ExpectCommit() - c.Assert(cp.Clear(tctx), check.IsNil) + s.Require().Nil(cp.Clear(tctx)) // load table point and exitSafe, with enable GTID s.cfg.EnableGTID = true flavor := mysql.MySQLFlavor @@ -479,12 +478,12 @@ func (s *testCheckpointSuite) testTableCheckPoint(c *check.C, cp CheckPoint) { sqlmock.NewRows(columns).AddRow("", "", pos2.Name, pos2.Pos, gs.String(), pos2.Name, pos2.Pos, gs.String(), "null", true). AddRow(schemaName, tableName, pos2.Name, pos2.Pos, gs.String(), "", 0, "", tiBytes, false)) err = cp.Load(tctx) - c.Assert(err, check.IsNil) - c.Assert(cp.GlobalPoint(), check.DeepEquals, binlog.NewLocation(pos2, gs)) + s.Require().NoError(err) + s.Require().Equal(binlog.NewLocation(pos2, gs), cp.GlobalPoint()) rcp = cp.(*RemoteCheckPoint) - c.Assert(rcp.points[schemaName][tableName].TableInfo(), check.NotNil) - c.Assert(rcp.points[schemaName][tableName].flushedPoint.ti, check.NotNil) - c.Assert(*rcp.safeModeExitPoint, check.DeepEquals, binlog.NewLocation(pos2, gs)) + s.Require().NotNil(rcp.points[schemaName][tableName].TableInfo()) + s.Require().NotNil(rcp.points[schemaName][tableName].flushedPoint.ti) + s.Require().Equal(binlog.NewLocation(pos2, gs), *rcp.safeModeExitPoint) } func TestRemoteCheckPointLoadIntoSchemaTracker(t *testing.T) { diff --git a/dm/syncer/compactor_test.go b/dm/syncer/compactor_test.go index 406f0db206..fa06950112 100644 --- a/dm/syncer/compactor_test.go +++ b/dm/syncer/compactor_test.go @@ -19,7 +19,6 @@ import ( "time" "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/util/mock" @@ -59,7 +58,7 @@ func randString(n int) string { return string(b) } -func (s *testSyncerSuite) TestCompactJob(c *check.C) { +func (s *testSyncerSuite) TestCompactJob() { compactor := &compactor{ bufferSize: 10000, logger: log.L(), @@ -76,7 +75,7 @@ func (s *testSyncerSuite) TestCompactJob(c *check.C) { targetTable := &cdcmodel.TableName{Schema: "test", Table: "tb"} schemaStr := "create table test.tb(id int primary key, col1 int, name varchar(24))" ti, err := createTableInfo(p, se, 0, schemaStr) - c.Assert(err, check.IsNil) + s.Require().NoError(err) var dml *sqlmodel.RowChange var dmls []*sqlmodel.RowChange @@ -152,29 +151,29 @@ func (s *testSyncerSuite) TestCompactJob(c *check.C) { noCompactNumber := end - i compactNumber := 0 for _, dml := range dmls[i:end] { - c.Logf("before compact, dml: %s", dml.String()) + s.T().Logf("before compact, dml: %s", dml.String()) } for _, j := range compactor.buffer { if j != nil { compactKV = mockExecute(compactKV, []*sqlmodel.RowChange{j.dml}) compactNumber++ - c.Logf("after compact, dml: %s", j.dml.String()) + s.T().Logf("after compact, dml: %s", j.dml.String()) } } - c.Logf("before compact: %d, after compact: %d", noCompactNumber, compactNumber) - c.Assert(compactKV, check.DeepEquals, kv) + s.T().Logf("before compact: %d, after compact: %d", noCompactNumber, compactNumber) + s.Require().Equal(kv, compactKV) compactor.keyMap = make(map[string]map[string]int) compactor.buffer = compactor.buffer[0:0] } } -func (s *testSyncerSuite) TestCompactorSafeMode(c *check.C) { +func (s *testSyncerSuite) TestCompactorSafeMode() { p := parser.New() se := mock.NewContext() sourceTable := &cdcmodel.TableName{Schema: "test", Table: "tb"} schemaStr := "create table test.tb(id int primary key, col1 int, name varchar(24))" ti, err := createTableInfo(p, se, 0, schemaStr) - c.Assert(err, check.IsNil) + s.Require().NoError(err) testCases := []struct { input []*job @@ -282,7 +281,7 @@ func (s *testSyncerSuite) TestCompactorSafeMode(c *check.C) { metricsProxies: metrics.DefaultMetricsProxies.CacheForOneTask("task", "worker", "source"), } - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/syncer/SkipFlushCompactor", `return()`), check.IsNil) + s.Require().Nil(failpoint.Enable("github.com/pingcap/tiflow/dm/syncer/SkipFlushCompactor", `return()`)) //nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/syncer/SkipFlushCompactor") @@ -293,16 +292,16 @@ func (s *testSyncerSuite) TestCompactorSafeMode(c *check.C) { inCh <- j } inCh <- newFlushJob(syncer.cfg.WorkerCount, 1) - c.Assert( + s.Require().Equal(true, utils.WaitSomething(10, time.Millisecond, func() bool { return len(outCh) == len(tc.output)+1 - }), check.Equals, true) + })) for i := 0; i <= len(tc.output); i++ { j := <-outCh if i < len(tc.output) { - c.Assert(j.String(), check.Equals, tc.output[i].String()) + s.Require().Equal(tc.output[i].String(), j.String()) } else { - c.Assert(j.tp, check.Equals, flush) + s.Require().Equal(flush, j.tp) } } } diff --git a/dm/syncer/dbconn/upstream_db_test.go b/dm/syncer/dbconn/upstream_db_test.go index fa12465942..6a8983b9f8 100644 --- a/dm/syncer/dbconn/upstream_db_test.go +++ b/dm/syncer/dbconn/upstream_db_test.go @@ -17,26 +17,30 @@ import ( "context" "database/sql" "fmt" + "testing" "time" "github.com/go-mysql-org/go-mysql/replication" "github.com/google/uuid" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/config" "github.com/pingcap/tiflow/dm/pkg/conn" tcontext "github.com/pingcap/tiflow/dm/pkg/context" + "github.com/stretchr/testify/suite" ) -var _ = check.Suite(&testDBSuite{}) +func TestDBSuite(t *testing.T) { + suite.Run(t, new(testDBSuite)) +} type testDBSuite struct { + suite.Suite db *sql.DB syncer *replication.BinlogSyncer streamer *replication.BinlogStreamer cfg *config.SubTaskConfig } -func (s *testDBSuite) SetUpSuite(c *check.C) { +func (s *testDBSuite) SetupSuite() { s.cfg = &config.SubTaskConfig{ From: config.GetDBConfigForTest(), To: config.GetDBConfigForTest(), @@ -49,20 +53,23 @@ func (s *testDBSuite) SetUpSuite(c *check.C) { s.cfg.From.Adjust() s.cfg.To.Adjust() - dir := c.MkDir() + dir := s.T().TempDir() s.cfg.RelayDir = dir var err error dbAddr := fmt.Sprintf("%s:%s@tcp(%s:%d)/?charset=utf8", s.cfg.From.User, s.cfg.From.Password, s.cfg.From.Host, s.cfg.From.Port) s.db, err = sql.Open("mysql", dbAddr) - c.Assert(err, check.IsNil) + s.Require().NoError(err) + if err = s.db.Ping(); err != nil { + s.T().Skipf("skipping suite, upstream MySQL is not available: %v", err) + } - s.resetBinlogSyncer(c) + s.resetBinlogSyncer() _, err = s.db.Exec("SET GLOBAL binlog_format = 'ROW';") - c.Assert(err, check.IsNil) + s.Require().NoError(err) } -func (s *testDBSuite) resetBinlogSyncer(c *check.C) { +func (s *testDBSuite) resetBinlogSyncer() { cfg := replication.BinlogSyncerConfig{ ServerID: s.cfg.ServerID, Flavor: "mysql", @@ -80,28 +87,28 @@ func (s *testDBSuite) resetBinlogSyncer(c *check.C) { } pos, _, err := conn.GetPosAndGs(tcontext.Background(), conn.NewBaseDBForTest(s.db), "mysql") - c.Assert(err, check.IsNil) + s.Require().NoError(err) s.syncer = replication.NewBinlogSyncer(cfg) s.streamer, err = s.syncer.StartSync(pos) - c.Assert(err, check.IsNil) + s.Require().NoError(err) } -func (s *testDBSuite) TestGetServerUUID(c *check.C) { +func (s *testDBSuite) TestGetServerUUID() { u, err := conn.GetServerUUID(tcontext.Background(), conn.NewBaseDBForTest(s.db), "mysql") - c.Assert(err, check.IsNil) + s.Require().NoError(err) _, err = uuid.Parse(u) - c.Assert(err, check.IsNil) + s.Require().NoError(err) } -func (s *testDBSuite) TestGetServerID(c *check.C) { +func (s *testDBSuite) TestGetServerID() { id, err := conn.GetServerID(tcontext.Background(), conn.NewBaseDBForTest(s.db)) - c.Assert(err, check.IsNil) - c.Assert(id, check.Greater, uint32(0)) + s.Require().NoError(err) + s.Require().Greater(id, uint32(0)) } -func (s *testDBSuite) TestGetServerUnixTS(c *check.C) { +func (s *testDBSuite) TestGetServerUnixTS() { id, err := conn.GetServerUnixTS(context.Background(), conn.NewBaseDBForTest(s.db)) - c.Assert(err, check.IsNil) - c.Assert(id, check.Greater, int64(0)) + s.Require().NoError(err) + s.Require().Greater(id, int64(0)) } diff --git a/dm/syncer/ddl_test.go b/dm/syncer/ddl_test.go index 23d7490fa1..686f8dbb47 100644 --- a/dm/syncer/ddl_test.go +++ b/dm/syncer/ddl_test.go @@ -21,7 +21,6 @@ import ( "github.com/DATA-DOG/go-sqlmock" "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/util/filter" @@ -40,11 +39,7 @@ import ( "go.uber.org/zap" ) -var _ = check.Suite(&testDDLSuite{}) - -type testDDLSuite struct{} - -func (s *testDDLSuite) newSubTaskCfg(dbCfg dbconfig.DBConfig) *config.SubTaskConfig { +func newSubTaskCfg(dbCfg dbconfig.DBConfig) *config.SubTaskConfig { return &config.SubTaskConfig{ From: dbCfg, To: dbCfg, @@ -58,7 +53,7 @@ func (s *testDDLSuite) newSubTaskCfg(dbCfg dbconfig.DBConfig) *config.SubTaskCon } } -func (s *testDDLSuite) TestAnsiQuotes(c *check.C) { +func TestAnsiQuotes(t *testing.T) { ansiQuotesCases := []string{ "create database `test`", "create table `test`.`test`(id int)", @@ -73,18 +68,18 @@ func (s *testDDLSuite) TestAnsiQuotes(c *check.C) { mock.ExpectQuery("SHOW VARIABLES LIKE"). WillReturnRows(sqlmock.NewRows([]string{"Variable_name", "Value"}). AddRow("sql_mode", "ANSI_QUOTES")) - c.Assert(err, check.IsNil) + require.NoError(t, err) parser, err := conn.GetParser(tcontext.Background(), conn.NewBaseDBForTest(db)) - c.Assert(err, check.IsNil) + require.NoError(t, err) for _, sql := range ansiQuotesCases { _, err = parser.ParseOneStmt(sql, "", "") - c.Assert(err, check.IsNil) + require.NoError(t, err) } } -func (s *testDDLSuite) TestDDLWithDashComments(c *check.C) { +func TestDDLWithDashComments(t *testing.T) { sql := `-- -- this is a comment. -- @@ -92,10 +87,10 @@ CREATE TABLE test.test_table_with_c (id int); ` parser := parser.New() _, err := parserpkg.Parse(parser, sql, "", "") - c.Assert(err, check.IsNil) + require.NoError(t, err) } -func (s *testDDLSuite) TestCommentQuote(c *check.C) { +func TestCommentQuote(t *testing.T) { sql := "ALTER TABLE schemadb.ep_edu_course_message_auto_reply MODIFY answer JSON COMMENT '回复的内容-格式为list,有两个字段:\"answerType\"://''发送客服消息类型:1-文本消息,2-图片,3-图文链接''; answer:回复内容';" expectedSQL := "ALTER TABLE `schemadb`.`ep_edu_course_message_auto_reply` MODIFY COLUMN `answer` JSON COMMENT '回复的内容-格式为list,有两个字段:\"answerType\"://''发送客服消息类型:1-文本消息,2-图片,3-图文链接''; answer:回复内容'" @@ -110,26 +105,26 @@ func (s *testDDLSuite) TestCommentQuote(c *check.C) { p: parser.New(), } stmt, err := parseOneStmt(qec) - c.Assert(err, check.IsNil) + require.NoError(t, err) qec.splitDDLs, err = parserpkg.SplitDDL(stmt, qec.ddlSchema) - c.Assert(err, check.IsNil) + require.NoError(t, err) syncer := NewSyncer(&config.SubTaskConfig{Flavor: mysql.MySQLFlavor}, nil, nil) syncer.tctx = tctx - c.Assert(syncer.genRouter(), check.IsNil) + require.NoError(t, syncer.genRouter()) ddlWorker := NewDDLWorker(&tctx.Logger, syncer) for _, sql := range qec.splitDDLs { sqls, err := ddlWorker.processOneDDL(qec, sql) - c.Assert(err, check.IsNil) + require.NoError(t, err) qec.appliedDDLs = append(qec.appliedDDLs, sqls...) } - c.Assert(len(qec.appliedDDLs), check.Equals, 1) - c.Assert(qec.appliedDDLs[0], check.Equals, expectedSQL) + require.Equal(t, 1, len(qec.appliedDDLs)) + require.Equal(t, expectedSQL, qec.appliedDDLs[0]) } -func (s *testDDLSuite) TestResolveDDLSQL(c *check.C) { +func TestResolveDDLSQL(t *testing.T) { // duplicate with pkg/parser sqls := []string{ "create schema `s1`", @@ -224,7 +219,7 @@ func (s *testDDLSuite) TestResolveDDLSQL(c *check.C) { syncer.tctx = tctx syncer.baList, err = filter.New(syncer.cfg.CaseSensitive, syncer.cfg.BAList) syncer.metricsProxies = metrics.DefaultMetricsProxies.CacheForOneTask("task", "worker", "source") - c.Assert(err, check.IsNil) + require.NoError(t, err) syncer.tableRouter, err = regexprrouter.NewRegExprRouter(false, []*router.TableRule{ { @@ -232,7 +227,7 @@ func (s *testDDLSuite) TestResolveDDLSQL(c *check.C) { TargetSchema: "xs1", }, }) - c.Assert(err, check.IsNil) + require.NoError(t, err) testEC := &eventContext{ tctx: tctx, @@ -250,13 +245,13 @@ func (s *testDDLSuite) TestResolveDDLSQL(c *check.C) { eventStatusVars: statusVars, } stmt, err := parseOneStmt(qec) - c.Assert(err, check.IsNil) + require.NoError(t, err) qec.splitDDLs, err = parserpkg.SplitDDL(stmt, qec.ddlSchema) - c.Assert(err, check.IsNil) + require.NoError(t, err) for _, sql2 := range qec.splitDDLs { sqls, err := ddlWorker.processOneDDL(qec, sql2) - c.Assert(err, check.IsNil) + require.NoError(t, err) for _, sql3 := range sqls { if len(sql3) == 0 { continue @@ -264,17 +259,17 @@ func (s *testDDLSuite) TestResolveDDLSQL(c *check.C) { qec.appliedDDLs = append(qec.appliedDDLs, sql3) } } - c.Assert(qec.appliedDDLs, check.DeepEquals, expectedSQLs[i]) - c.Assert(targetSQLs[i], check.HasLen, len(qec.appliedDDLs)) + require.Equal(t, expectedSQLs[i], qec.appliedDDLs) + require.Len(t, targetSQLs[i], len(qec.appliedDDLs)) for j, sql2 := range qec.appliedDDLs { ddlInfo, err2 := ddlWorker.genDDLInfo(qec, sql2) - c.Assert(err2, check.IsNil) - c.Assert(targetSQLs[i][j], check.Equals, ddlInfo.routedDDL) + require.NoError(t, err2) + require.Equal(t, ddlInfo.routedDDL, targetSQLs[i][j]) } } } -func (s *testDDLSuite) TestRejectForeignKeyDDL(c *check.C) { +func TestRejectForeignKeyDDL(t *testing.T) { tctx := tcontext.Background().WithLogger(log.With(zap.String("test", "TestRejectForeignKeyDDL"))) testEC := &eventContext{tctx: tctx} @@ -286,7 +281,7 @@ func (s *testDDLSuite) TestRejectForeignKeyDDL(c *check.C) { } syncer := NewSyncer(cfg, nil, nil) syncer.tctx = tctx - c.Assert(syncer.genRouter(), check.IsNil) + require.NoError(t, syncer.genRouter()) ddlWorker := NewDDLWorker(&tctx.Logger, syncer) cases := []string{ @@ -301,8 +296,8 @@ func (s *testDDLSuite) TestRejectForeignKeyDDL(c *check.C) { p: parser.New(), } _, err := ddlWorker.genDDLInfo(qec, sql) - c.Assert(err, check.NotNil) - c.Assert(err.Error(), check.Matches, ".*foreign_key_checks=1.*") + require.Error(t, err) + require.Regexp(t, ".*foreign_key_checks=1.*", err.Error()) } cfgOff := &config.SubTaskConfig{ @@ -313,7 +308,7 @@ func (s *testDDLSuite) TestRejectForeignKeyDDL(c *check.C) { } syncerOff := NewSyncer(cfgOff, nil, nil) syncerOff.tctx = tctx - c.Assert(syncerOff.genRouter(), check.IsNil) + require.NoError(t, syncerOff.genRouter()) ddlWorkerOff := NewDDLWorker(&tctx.Logger, syncerOff) qecOff := &queryEventContext{ @@ -323,10 +318,10 @@ func (s *testDDLSuite) TestRejectForeignKeyDDL(c *check.C) { p: parser.New(), } _, err := ddlWorkerOff.genDDLInfo(qecOff, cases[0]) - c.Assert(err, check.IsNil) + require.NoError(t, err) } -func (s *testDDLSuite) TestParseOneStmt(c *check.C) { +func TestParseOneStmt(t *testing.T) { cases := []struct { sql string isDDL bool @@ -410,16 +405,16 @@ func (s *testDDLSuite) TestParseOneStmt(c *check.C) { qec.originSQL = cs.sql stmt, err := parseOneStmt(qec) if cs.hasError { - c.Assert(err, check.NotNil) + require.Error(t, err) } else { - c.Assert(err, check.IsNil) + require.NoError(t, err) } _, ok := stmt.(ast.DDLNode) - c.Assert(ok, check.Equals, cs.isDDL) + require.Equal(t, cs.isDDL, ok) } } -func (s *testDDLSuite) TestResolveGeneratedColumnSQL(c *check.C) { +func TestResolveGeneratedColumnSQL(t *testing.T) { testCases := []struct { sql string expected string @@ -437,7 +432,7 @@ func (s *testDDLSuite) TestResolveGeneratedColumnSQL(c *check.C) { tctx := tcontext.Background().WithLogger(log.With(zap.String("test", "TestResolveGeneratedColumnSQL"))) syncer := NewSyncer(&config.SubTaskConfig{Flavor: mysql.MySQLFlavor}, nil, nil) syncer.tctx = tctx - c.Assert(syncer.genRouter(), check.IsNil) + require.Nil(t, syncer.genRouter()) p := parser.New() ddlWorker := NewDDLWorker(&tctx.Logger, syncer) for _, tc := range testCases { @@ -451,22 +446,22 @@ func (s *testDDLSuite) TestResolveGeneratedColumnSQL(c *check.C) { p: p, } stmt, err := parseOneStmt(qec) - c.Assert(err, check.IsNil) + require.NoError(t, err) qec.splitDDLs, err = parserpkg.SplitDDL(stmt, qec.ddlSchema) - c.Assert(err, check.IsNil) + require.NoError(t, err) for _, sql := range qec.splitDDLs { sqls, err := ddlWorker.processOneDDL(qec, sql) - c.Assert(err, check.IsNil) + require.NoError(t, err) qec.appliedDDLs = append(qec.appliedDDLs, sqls...) } - c.Assert(len(qec.appliedDDLs), check.Equals, 1) - c.Assert(qec.appliedDDLs[0], check.Equals, tc.expected) + require.Equal(t, 1, len(qec.appliedDDLs)) + require.Equal(t, tc.expected, qec.appliedDDLs[0]) } } -func (s *testDDLSuite) TestResolveOnlineDDL(c *check.C) { +func TestResolveOnlineDDL(t *testing.T) { cases := []struct { sql string expectSQL string @@ -505,23 +500,23 @@ func (s *testDDLSuite) TestResolveOnlineDDL(c *check.C) { testEC := &eventContext{tctx: tctx} cluster, err := conn.NewCluster() - c.Assert(err, check.IsNil) - c.Assert(cluster.Start(), check.IsNil) + require.NoError(t, err) + require.Nil(t, cluster.Start()) mockClusterPort := cluster.Port dbCfg := config.GetDBConfigForTest() dbCfg.Port = mockClusterPort dbCfg.Password = "" - cfg := s.newSubTaskCfg(dbCfg) + cfg := newSubTaskCfg(dbCfg) var qec *queryEventContext for _, ca := range cases { plugin, err := onlineddl.NewRealOnlinePlugin(tctx, cfg, nil) - c.Assert(err, check.IsNil) + require.NoError(t, err) syncer := NewSyncer(cfg, nil, nil) syncer.tctx = tctx syncer.onlineDDL = plugin - c.Assert(plugin.Clear(tctx), check.IsNil) - c.Assert(syncer.genRouter(), check.IsNil) + require.Nil(t, plugin.Clear(tctx)) + require.Nil(t, syncer.genRouter()) qec = &queryEventContext{ eventContext: testEC, ddlSchema: "test", @@ -530,26 +525,26 @@ func (s *testDDLSuite) TestResolveOnlineDDL(c *check.C) { } qec.originSQL = ca.sql stmt, err := parseOneStmt(qec) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, ok := stmt.(ast.DDLNode) - c.Assert(ok, check.IsTrue) + require.True(t, ok) qec.splitDDLs, err = parserpkg.SplitDDL(stmt, qec.ddlSchema) - c.Assert(err, check.IsNil) + require.NoError(t, err) ddlWorker := NewDDLWorker(&tctx.Logger, syncer) for _, sql := range qec.splitDDLs { sqls, err := ddlWorker.processOneDDL(qec, sql) - c.Assert(err, check.IsNil) + require.NoError(t, err) qec.appliedDDLs = append(qec.appliedDDLs, sqls...) } if len(ca.expectSQL) != 0 { - c.Assert(qec.appliedDDLs, check.HasLen, 1) - c.Assert(qec.appliedDDLs[0], check.Equals, ca.expectSQL) + require.Len(t, qec.appliedDDLs, 1) + require.Equal(t, ca.expectSQL, qec.appliedDDLs[0]) } } cluster.Stop() } -func (s *testDDLSuite) TestMistakeOnlineDDLRegex(c *check.C) { +func TestMistakeOnlineDDLRegex(t *testing.T) { cases := []struct { onlineType string trashName string @@ -586,21 +581,21 @@ func (s *testDDLSuite) TestMistakeOnlineDDLRegex(c *check.C) { ec := eventContext{tctx: tctx} cluster, err := conn.NewCluster() - c.Assert(err, check.IsNil) - c.Assert(cluster.Start(), check.IsNil) + require.NoError(t, err) + require.Nil(t, cluster.Start()) mockClusterPort := cluster.Port - c.Assert(err, check.IsNil) + require.NoError(t, err) dbCfg := config.GetDBConfigForTest() dbCfg.Port = mockClusterPort dbCfg.Password = "" - cfg := s.newSubTaskCfg(dbCfg) + cfg := newSubTaskCfg(dbCfg) for _, ca := range cases { plugin, err := onlineddl.NewRealOnlinePlugin(tctx, cfg, nil) - c.Assert(err, check.IsNil) + require.NoError(t, err) syncer := NewSyncer(cfg, nil, nil) - c.Assert(syncer.genRouter(), check.IsNil) + require.Nil(t, syncer.genRouter()) syncer.onlineDDL = plugin - c.Assert(plugin.Clear(tctx), check.IsNil) + require.Nil(t, plugin.Clear(tctx)) // ghost table sql := fmt.Sprintf("ALTER TABLE `test`.`%s` ADD COLUMN `n` INT", ca.ghostname) @@ -611,16 +606,16 @@ func (s *testDDLSuite) TestMistakeOnlineDDLRegex(c *check.C) { } ddlWorker := NewDDLWorker(&tctx.Logger, syncer) sqls, err := ddlWorker.processOneDDL(qec, sql) - c.Assert(err, check.IsNil) + require.NoError(t, err) table := ca.ghostname matchRules := config.ShadowTableRules if ca.matchGho { - c.Assert(sqls, check.HasLen, 0) + require.Len(t, sqls, 0) table = ca.trashName matchRules = config.TrashTableRules } else { - c.Assert(sqls, check.HasLen, 1) - c.Assert(sqls[0], check.Equals, sql) + require.Len(t, sqls, 1) + require.Equal(t, sql, sqls[0]) } sql = fmt.Sprintf("RENAME TABLE `test`.`t1` TO `test`.`%s`, `test`.`%s` TO `test`.`t1`", ca.trashName, ca.ghostname) qec = &queryEventContext{ @@ -629,14 +624,15 @@ func (s *testDDLSuite) TestMistakeOnlineDDLRegex(c *check.C) { p: p, } sqls, err = ddlWorker.processOneDDL(qec, sql) - c.Assert(terror.ErrConfigOnlineDDLMistakeRegex.Equal(err), check.IsTrue) - c.Assert(sqls, check.HasLen, 0) - c.Assert(err, check.ErrorMatches, ".*"+sql+".*"+table+".*"+matchRules+".*") + require.True(t, terror.ErrConfigOnlineDDLMistakeRegex.Equal(err)) + require.Len(t, sqls, 0) + require.Error(t, err) + require.Regexp(t, ".*"+sql+".*"+table+".*"+matchRules+".*", err.Error()) } cluster.Stop() } -func (s *testDDLSuite) TestDropSchemaInSharding(c *check.C) { +func TestDropSchemaInSharding(t *testing.T) { var ( targetTable = &filter.Table{ Schema: "target_db", @@ -648,22 +644,22 @@ func (s *testDDLSuite) TestDropSchemaInSharding(c *check.C) { tctx = tcontext.Background() ) dbCfg := config.GetDBConfigForTest() - cfg := s.newSubTaskCfg(dbCfg) + cfg := newSubTaskCfg(dbCfg) cfg.ShardMode = config.ShardPessimistic syncer := NewSyncer(cfg, nil, nil) // nolint:dogsled _, _, _, _, err := syncer.sgk.AddGroup(targetTable, []string{source1}, nil, true) - c.Assert(err, check.IsNil) + require.NoError(t, err) // nolint:dogsled _, _, _, _, err = syncer.sgk.AddGroup(targetTable, []string{source2}, nil, true) - c.Assert(err, check.IsNil) - c.Assert(syncer.sgk.Groups(), check.HasLen, 2) + require.NoError(t, err) + require.Len(t, syncer.sgk.Groups(), 2) pessimist := NewPessimistDDL(&syncer.tctx.Logger, syncer) - c.Assert(pessimist.dropSchemaInSharding(tctx, sourceDB), check.IsNil) - c.Assert(syncer.sgk.Groups(), check.HasLen, 0) + require.Nil(t, pessimist.dropSchemaInSharding(tctx, sourceDB)) + require.Len(t, syncer.sgk.Groups(), 0) } -func (s *testDDLSuite) TestClearOnlineDDL(c *check.C) { +func TestClearOnlineDDL(t *testing.T) { var ( targetTable = &filter.Table{ Schema: "target_db", @@ -676,7 +672,7 @@ func (s *testDDLSuite) TestClearOnlineDDL(c *check.C) { tctx = tcontext.Background() ) dbCfg := config.GetDBConfigForTest() - cfg := s.newSubTaskCfg(dbCfg) + cfg := newSubTaskCfg(dbCfg) cfg.ShardMode = config.ShardPessimistic syncer := NewSyncer(cfg, nil, nil) mock := mockOnlinePlugin{ @@ -686,17 +682,17 @@ func (s *testDDLSuite) TestClearOnlineDDL(c *check.C) { // nolint:dogsled _, _, _, _, err := syncer.sgk.AddGroup(targetTable, []string{source1}, nil, true) - c.Assert(err, check.IsNil) + require.NoError(t, err) // nolint:dogsled _, _, _, _, err = syncer.sgk.AddGroup(targetTable, []string{source2}, nil, true) - c.Assert(err, check.IsNil) + require.NoError(t, err) pessimist := NewPessimistDDL(&syncer.tctx.Logger, syncer) - c.Assert(pessimist.clearOnlineDDL(tctx, targetTable), check.IsNil) - c.Assert(mock.toFinish, check.HasLen, 0) + require.Nil(t, pessimist.clearOnlineDDL(tctx, targetTable)) + require.Len(t, mock.toFinish, 0) } -func (s *testDDLSuite) TestAdjustDatabaseCollation(c *check.C) { +func TestAdjustDatabaseCollation(t *testing.T) { statusVarsArray := [][]byte{ { 4, 0, 0, 0, 0, 46, 0, @@ -752,13 +748,13 @@ func (s *testDDLSuite) TestAdjustDatabaseCollation(c *check.C) { targetTables: []*filter.Table{tab}, } stmt, err := p.ParseOneStmt(sql, "", "") - c.Assert(err, check.IsNil) - c.Assert(stmt, check.NotNil) + require.NoError(t, err) + require.NotNil(t, stmt) ddlInfo.stmtCache = stmt ddlWorker.adjustCollation(ddlInfo, statusVars, charsetAndDefaultCollationMap, idAndCollationMap) routedDDL, err := parserpkg.RenameDDLTable(ddlInfo.stmtCache, ddlInfo.targetTables) - c.Assert(err, check.IsNil) - c.Assert(routedDDL, check.Equals, expectedSQLs[i][j]) + require.NoError(t, err) + require.Equal(t, expectedSQLs[i][j], routedDDL) } } } diff --git a/dm/syncer/filter_test.go b/dm/syncer/filter_test.go index ed8e20f558..c0ec0b25eb 100644 --- a/dm/syncer/filter_test.go +++ b/dm/syncer/filter_test.go @@ -20,7 +20,6 @@ import ( "github.com/DATA-DOG/go-sqlmock" "github.com/go-mysql-org/go-mysql/mysql" "github.com/go-mysql-org/go-mysql/replication" - "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/util/filter" "github.com/pingcap/tiflow/dm/config" @@ -32,31 +31,31 @@ import ( "github.com/pingcap/tiflow/dm/pkg/utils" "github.com/pingcap/tiflow/dm/syncer/dbconn" bf "github.com/pingcap/tiflow/pkg/binlog-filter" + "github.com/stretchr/testify/suite" ) type testFilterSuite struct { + suite.Suite baseConn *conn.BaseConn db *sql.DB } -var _ = check.Suite(&testFilterSuite{}) - -func (s *testFilterSuite) SetUpSuite(c *check.C) { +func (s *testFilterSuite) SetupSuite() { db, mock, err := sqlmock.New() - c.Assert(err, check.IsNil) + s.Require().NoError(err) s.db = db mock.ExpectClose() con, err := db.Conn(context.Background()) - c.Assert(err, check.IsNil) + s.Require().NoError(err) s.baseConn = conn.NewBaseConnForTest(con, nil) } -func (s *testFilterSuite) TearDownSuite(c *check.C) { - c.Assert(s.baseConn.DBConn.Close(), check.IsNil) - c.Assert(s.db.Close(), check.IsNil) +func (s *testFilterSuite) TearDownSuite() { + s.Require().Nil(s.baseConn.DBConn.Close()) + s.Require().Nil(s.db.Close()) } -func (s *testFilterSuite) TestSkipQueryEvent(c *check.C) { +func (s *testFilterSuite) TestSkipQueryEvent() { cfg := &config.SubTaskConfig{ Flavor: mysql.MySQLFlavor, BAList: &filter.Rules{ @@ -64,14 +63,14 @@ func (s *testFilterSuite) TestSkipQueryEvent(c *check.C) { }, } syncer := NewSyncer(cfg, nil, nil) - c.Assert(syncer.genRouter(), check.IsNil) + s.Require().Nil(syncer.genRouter()) var err error syncer.baList, err = filter.New(syncer.cfg.CaseSensitive, syncer.cfg.BAList) - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer.ddlDBConn = dbconn.NewDBConn(syncer.cfg, s.baseConn) syncer.schemaTracker, err = schema.NewTestTracker(context.Background(), syncer.cfg.Name, syncer.ddlDBConn, log.L()) - c.Assert(err, check.IsNil) + s.Require().NoError(err) defer syncer.schemaTracker.Close() syncer.exprFilterGroup = NewExprFilterGroup(tcontext.Background(), utils.NewSessionCtx(nil), nil) @@ -86,7 +85,7 @@ func (s *testFilterSuite) TestSkipQueryEvent(c *check.C) { }, } syncer.binlogFilter, err = bf.NewBinlogEvent(false, filterRules) - c.Assert(err, check.IsNil) + s.Require().NoError(err) cases := []struct { sql string @@ -143,17 +142,17 @@ func (s *testFilterSuite) TestSkipQueryEvent(c *check.C) { ddlSchema: ca.schema, } ddlInfo, err := ddlWorker.genDDLInfo(qec, ca.sql) - c.Assert(err, check.IsNil) + s.Require().NoError(err) qec.ddlSchema = ca.schema qec.originSQL = ca.sql skipped, err2 := syncer.skipQueryEvent(qec, ddlInfo) - c.Assert(err2, check.IsNil) - c.Assert(skipped, check.Equals, ca.expectSkipped) - c.Assert(len(ddlInfo.originDDL) == 0, check.Equals, ca.isEmptySQL) + s.Require().Nil(err2) + s.Require().Equal(ca.expectSkipped, skipped) + s.Require().Equal(ca.isEmptySQL, len(ddlInfo.originDDL) == 0) } } -func (s *testFilterSuite) TestSkipRowsEvent(c *check.C) { +func (s *testFilterSuite) TestSkipRowsEvent() { syncer := &Syncer{} filterRules := []*bf.BinlogEventRule{ { @@ -166,7 +165,7 @@ func (s *testFilterSuite) TestSkipRowsEvent(c *check.C) { } var err error syncer.binlogFilter, err = bf.NewBinlogEvent(false, filterRules) - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer.onlineDDL = mockOnlinePlugin{} cases := []struct { @@ -196,12 +195,12 @@ func (s *testFilterSuite) TestSkipRowsEvent(c *check.C) { } for _, ca := range cases { needSkip, err2 := syncer.skipRowsEvent(ca.table, ca.eventType) - c.Assert(err2, check.IsNil) - c.Assert(needSkip, check.Equals, ca.expected) + s.Require().Nil(err2) + s.Require().Equal(ca.expected, needSkip) } } -func (s *testFilterSuite) TestSkipByFilter(c *check.C) { +func (s *testFilterSuite) TestSkipByFilter() { cfg := &config.SubTaskConfig{ Flavor: mysql.MySQLFlavor, BAList: &filter.Rules{ @@ -211,7 +210,7 @@ func (s *testFilterSuite) TestSkipByFilter(c *check.C) { syncer := NewSyncer(cfg, nil, nil) var err error syncer.baList, err = filter.New(syncer.cfg.CaseSensitive, syncer.cfg.BAList) - c.Assert(err, check.IsNil) + s.Require().NoError(err) // test binlog filter filterRules := []*bf.BinlogEventRule{ { @@ -239,7 +238,7 @@ func (s *testFilterSuite) TestSkipByFilter(c *check.C) { }, } syncer.binlogFilter, err = bf.NewBinlogEvent(false, filterRules) - c.Assert(err, check.IsNil) + s.Require().NoError(err) cases := []struct { sql string @@ -267,12 +266,12 @@ func (s *testFilterSuite) TestSkipByFilter(c *check.C) { } for _, ca := range cases { skipped, err2 := syncer.skipByFilter(ca.table, ca.eventType, ca.sql) - c.Assert(err2, check.IsNil) - c.Assert(skipped, check.Equals, ca.expectSkipped) + s.Require().Nil(err2) + s.Require().Equal(ca.expectSkipped, skipped) } } -func (s *testFilterSuite) TestSkipByTable(c *check.C) { +func (s *testFilterSuite) TestSkipByTable() { cfg := &config.SubTaskConfig{ Flavor: mysql.MySQLFlavor, BAList: &filter.Rules{ @@ -282,7 +281,7 @@ func (s *testFilterSuite) TestSkipByTable(c *check.C) { syncer := NewSyncer(cfg, nil, nil) var err error syncer.baList, err = filter.New(syncer.cfg.CaseSensitive, syncer.cfg.BAList) - c.Assert(err, check.IsNil) + s.Require().NoError(err) cases := []struct { table *filter.Table @@ -304,6 +303,6 @@ func (s *testFilterSuite) TestSkipByTable(c *check.C) { } for _, ca := range cases { needSkip := syncer.skipByTable(ca.table) - c.Assert(needSkip, check.Equals, ca.expected) + s.Require().Equal(ca.expected, needSkip) } } diff --git a/dm/syncer/job_test.go b/dm/syncer/job_test.go index 03519901e6..51997a344c 100644 --- a/dm/syncer/job_test.go +++ b/dm/syncer/job_test.go @@ -17,7 +17,6 @@ import ( "testing" "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/util/filter" cdcmodel "github.com/pingcap/tiflow/cdc/model" "github.com/pingcap/tiflow/dm/pkg/binlog" @@ -25,11 +24,7 @@ import ( "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testJobSuite{}) - -type testJobSuite struct{} - -func (t *testJobSuite) TestJobTypeString(c *check.C) { +func TestJobTypeString(t *testing.T) { testCases := []struct { tp opType str string @@ -60,7 +55,7 @@ func (t *testJobSuite) TestJobTypeString(c *check.C) { for _, testCase := range testCases { tpStr := testCase.tp.String() - c.Assert(tpStr, check.Equals, testCase.str) + require.Equal(t, testCase.str, tpStr) } } @@ -113,13 +108,13 @@ func TestJob(t *testing.T) { } } -func (t *testJobSuite) TestQueueBucketName(c *check.C) { +func TestQueueBucketName(t *testing.T) { name := queueBucketName(0) - c.Assert(name, check.Equals, "q_0") + require.Equal(t, "q_0", name) name = queueBucketName(8) - c.Assert(name, check.Equals, "q_0") + require.Equal(t, "q_0", name) name = queueBucketName(9) - c.Assert(name, check.Equals, "q_1") + require.Equal(t, "q_1", name) } diff --git a/dm/syncer/safe-mode/mode_test.go b/dm/syncer/safe-mode/mode_test.go index 59bd43fb70..b13ee25f3d 100644 --- a/dm/syncer/safe-mode/mode_test.go +++ b/dm/syncer/safe-mode/mode_test.go @@ -16,42 +16,34 @@ package mode import ( "testing" - "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/util/filter" tcontext "github.com/pingcap/tiflow/dm/pkg/context" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testModeSuite{}) - -func TestSuite(t *testing.T) { - check.TestingT(t) -} - -type testModeSuite struct{} - -func (t *testModeSuite) TestMode(c *check.C) { +func TestMode(t *testing.T) { m := NewSafeMode() - c.Assert(m.Enable(), check.IsFalse) + require.False(t, m.Enable()) tctx := tcontext.Background() // Add 1 err := m.Add(tctx, 1) - c.Assert(err, check.IsNil) - c.Assert(m.Enable(), check.IsTrue) + require.NoError(t, err) + require.True(t, m.Enable()) err = m.Add(tctx, -1) - c.Assert(m.Enable(), check.IsFalse) - c.Assert(err, check.IsNil) + require.False(t, m.Enable()) + require.NoError(t, err) // Add n err = m.Add(tctx, 101) - c.Assert(m.Enable(), check.IsTrue) - c.Assert(err, check.IsNil) + require.True(t, m.Enable()) + require.NoError(t, err) err = m.Add(tctx, -1) - c.Assert(m.Enable(), check.IsTrue) - c.Assert(err, check.IsNil) + require.True(t, m.Enable()) + require.NoError(t, err) err = m.Add(tctx, -100) - c.Assert(m.Enable(), check.IsFalse) - c.Assert(err, check.IsNil) + require.False(t, m.Enable()) + require.NoError(t, err) // IncrForTable table := &filter.Table{ @@ -59,27 +51,27 @@ func (t *testModeSuite) TestMode(c *check.C) { Name: "table", } err = m.IncrForTable(tctx, table) - c.Assert(err, check.IsNil) + require.NoError(t, err) err = m.IncrForTable(tctx, table) // re-Add - c.Assert(err, check.IsNil) - c.Assert(m.Enable(), check.IsTrue) + require.NoError(t, err) + require.True(t, m.Enable()) err = m.DescForTable(tctx, table) - c.Assert(err, check.IsNil) - c.Assert(m.Enable(), check.IsFalse) + require.NoError(t, err) + require.False(t, m.Enable()) // Add n + IncrForTable err = m.Add(tctx, 100) - c.Assert(err, check.IsNil) + require.NoError(t, err) err = m.IncrForTable(tctx, table) - c.Assert(err, check.IsNil) - c.Assert(m.Enable(), check.IsTrue) + require.NoError(t, err) + require.True(t, m.Enable()) err = m.Add(tctx, -100) - c.Assert(err, check.IsNil) + require.NoError(t, err) err = m.DescForTable(tctx, table) - c.Assert(m.Enable(), check.IsFalse) - c.Assert(err, check.IsNil) + require.False(t, m.Enable()) + require.NoError(t, err) // Add becomes to negative err = m.Add(tctx, -1) - c.Assert(err, check.NotNil) + require.Error(t, err) } diff --git a/dm/syncer/shardddl/optimist_test.go b/dm/syncer/shardddl/optimist_test.go index 17ec11c55c..5a3b2f8d94 100644 --- a/dm/syncer/shardddl/optimist_test.go +++ b/dm/syncer/shardddl/optimist_test.go @@ -16,8 +16,8 @@ package shardddl import ( "context" "fmt" + "testing" - "github.com/pingcap/check" tiddl "github.com/pingcap/tidb/pkg/ddl" "github.com/pingcap/tidb/pkg/meta/model" "github.com/pingcap/tidb/pkg/parser" @@ -27,35 +27,32 @@ import ( "github.com/pingcap/tiflow/dm/pkg/log" "github.com/pingcap/tiflow/dm/pkg/shardddl/optimism" "github.com/pingcap/tiflow/dm/pkg/terror" + "github.com/stretchr/testify/require" ) -type testOptimist struct{} - -var _ = check.Suite(&testOptimist{}) - // clear keys in etcd test cluster. -func clearOptimistTestSourceInfoOperation(c *check.C) { - c.Assert(optimism.ClearTestInfoOperationColumn(etcdTestCli), check.IsNil) +func clearOptimistTestSourceInfoOperation(t *testing.T) { + require.NoError(t, optimism.ClearTestInfoOperationColumn(etcdTestCli)) } -func createTableInfo(c *check.C, p *parser.Parser, se sessionctx.Context, tableID int64, sql string) *model.TableInfo { +func createTableInfo(t *testing.T, p *parser.Parser, se sessionctx.Context, tableID int64, sql string) *model.TableInfo { node, err := p.ParseOneStmt(sql, "utf8mb4", "utf8mb4_bin") if err != nil { - c.Fatalf("fail to parse stmt, %v", err) + t.Fatalf("fail to parse stmt, %v", err) } createStmtNode, ok := node.(*ast.CreateTableStmt) if !ok { - c.Fatalf("%s is not a CREATE TABLE statement", sql) + t.Fatalf("%s is not a CREATE TABLE statement", sql) } info, err := tiddl.MockTableInfo(se, createStmtNode, tableID) if err != nil { - c.Fatalf("fail to create table info, %v", err) + t.Fatalf("fail to create table info, %v", err) } return info } -func (t *testOptimist) TestOptimist(c *check.C) { - defer clearOptimistTestSourceInfoOperation(c) +func testOptimist(t *testing.T) { + defer clearOptimistTestSourceInfoOperation(t) var ( task = "task-optimist" @@ -77,9 +74,9 @@ func (t *testOptimist) TestOptimist(c *check.C) { tblID int64 = 222 DDLs1 = []string{"ALTER TABLE bar ADD COLUMN c1 TEXT"} DDLs2 = []string{"ALTER TABLE bar ADD COLUMN c1 DATETIME"} - tiBefore = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) - tiAfter1 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT)`) - tiAfter2 = createTableInfo(c, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 DATETIME)`) + tiBefore = createTableInfo(t, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY)`) + tiAfter1 = createTableInfo(t, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 TEXT)`) + tiAfter2 = createTableInfo(t, p, se, tblID, `CREATE TABLE bar (id INT PRIMARY KEY, c1 DATETIME)`) info1 = o.ConstructInfo("foo-1", "bar-1", downSchema, downTable, DDLs1, tiBefore, []*model.TableInfo{tiAfter1}) op1 = optimism.NewOperation(ID, task, source, info1.UpSchema, info1.UpTable, DDLs1, optimism.ConflictNone, "", false, []string{}) info2 = o.ConstructInfo("foo-1", "bar-2", downSchema, downTable, DDLs2, tiBefore, []*model.TableInfo{tiAfter2}) @@ -95,116 +92,116 @@ func (t *testOptimist) TestOptimist(c *check.C) { defer cancel() tables := o.Tables() - c.Assert(len(tables), check.Equals, 0) + require.Equal(t, 0, len(tables)) // init with some source tables. err := o.Init(sourceTables) - c.Assert(err, check.IsNil) + require.NoError(t, err) stm, _, err := optimism.GetAllSourceTables(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(stm, check.HasLen, 1) - c.Assert(stm[task], check.HasLen, 1) - c.Assert(stm[task][source], check.DeepEquals, o.tables) + require.NoError(t, err) + require.Len(t, stm, 1) + require.Len(t, stm[task], 1) + require.Equal(t, o.tables, stm[task][source]) tables = o.Tables() - c.Assert(len(tables), check.Equals, 4) + require.Equal(t, 4, len(tables)) // no info and operation in pending. - c.Assert(o.PendingInfo(), check.IsNil) - c.Assert(o.PendingOperation(), check.IsNil) + require.Nil(t, o.PendingInfo()) + require.Nil(t, o.PendingOperation()) // put shard DDL info. rev1, err := o.PutInfo(info1) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) + require.NoError(t, err) + require.Greater(t, rev1, int64(0)) // have info in pending. info1c := o.PendingInfo() - c.Assert(info1c, check.NotNil) - c.Assert(*info1c, check.DeepEquals, info1) + require.NotNil(t, info1c) + require.Equal(t, info1, *info1c) // put the lock operation. rev2, putted, err := optimism.PutOperation(etcdTestCli, false, op1, rev1) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) - c.Assert(putted, check.IsTrue) + require.NoError(t, err) + require.Greater(t, rev2, rev1) + require.True(t, putted) // wait for the lock operation. op1c, err := o.GetOperation(ctx, info1, rev1) - c.Assert(err, check.IsNil) + require.NoError(t, err) op1.Revision = rev2 - c.Assert(op1c, check.DeepEquals, op1) + require.Equal(t, op1, op1c) // have operation in pending. op1cc := o.PendingOperation() - c.Assert(op1cc, check.NotNil) - c.Assert(*op1cc, check.DeepEquals, op1) + require.NotNil(t, op1cc) + require.Equal(t, op1, *op1cc) // mark the operation as done. - c.Assert(o.DoneOperation(op1), check.IsNil) + require.NoError(t, o.DoneOperation(op1)) // verify the operation and info. ifm, _, err := optimism.GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(ifm, check.HasLen, 1) - c.Assert(ifm[task], check.HasLen, 1) - c.Assert(ifm[task][source], check.HasLen, 1) - c.Assert(ifm[task][source][info1.UpSchema], check.HasLen, 1) + require.NoError(t, err) + require.Len(t, ifm, 1) + require.Len(t, ifm[task], 1) + require.Len(t, ifm[task][source], 1) + require.Len(t, ifm[task][source][info1.UpSchema], 1) info1WithVer := info1 info1WithVer.Version = 1 info1WithVer.Revision = rev1 - c.Assert(ifm[task][source][info1.UpSchema][info1.UpTable], check.DeepEquals, info1WithVer) + require.Equal(t, info1WithVer, ifm[task][source][info1.UpSchema][info1.UpTable]) opc := op1c opc.Done = true opm, _, err := optimism.GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(opm, check.HasLen, 1) - c.Assert(opm[task], check.HasLen, 1) - c.Assert(opm[task][source], check.HasLen, 1) - c.Assert(opm[task][source][op1.UpSchema], check.HasLen, 1) + require.NoError(t, err) + require.Len(t, opm, 1) + require.Len(t, opm[task], 1) + require.Len(t, opm[task][source], 1) + require.Len(t, opm[task][source][op1.UpSchema], 1) // Revision is in DoneOperation, skip this check opc.Revision = opm[task][source][op1.UpSchema][op1.UpTable].Revision - c.Assert(opm[task][source][op1.UpSchema][op1.UpTable], check.DeepEquals, opc) + require.Equal(t, opc, opm[task][source][op1.UpSchema][op1.UpTable]) // no info and operation in pending now. - c.Assert(o.PendingInfo(), check.IsNil) - c.Assert(o.PendingOperation(), check.IsNil) + require.Nil(t, o.PendingInfo()) + require.Nil(t, o.PendingOperation()) // handle `CREATE TABLE`. rev3, err := o.AddTable(infoCreate) - c.Assert(err, check.IsNil) - c.Assert(rev3, check.Greater, rev2) + require.NoError(t, err) + require.Greater(t, rev3, rev2) // handle `DROP TABLE`. rev4, err := o.RemoveTable(infoDrop) - c.Assert(err, check.IsNil) - c.Assert(rev4, check.Greater, rev3) + require.NoError(t, err) + require.Greater(t, rev4, rev3) ifm, _, err = optimism.GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(ifm[task][source][infoDrop.UpSchema], check.IsNil) - c.Assert(o.tables.Tables[infoCreate.DownSchema][infoCreate.DownTable][infoCreate.UpSchema], check.IsNil) + require.NoError(t, err) + require.Nil(t, ifm[task][source][infoDrop.UpSchema]) + require.Nil(t, o.tables.Tables[infoCreate.DownSchema][infoCreate.DownTable][infoCreate.UpSchema]) // put another info. rev5, err := o.PutInfo(info2) - c.Assert(err, check.IsNil) - c.Assert(o.PendingInfo(), check.NotNil) - c.Assert(*o.PendingInfo(), check.DeepEquals, info2) - c.Assert(o.PendingOperation(), check.IsNil) + require.NoError(t, err) + require.NotNil(t, o.PendingInfo()) + require.Equal(t, info2, *o.PendingInfo()) + require.Nil(t, o.PendingOperation()) // put another lock operation. rev6, putted, err := optimism.PutOperation(etcdTestCli, false, op2, rev5) - c.Assert(err, check.IsNil) - c.Assert(rev6, check.Greater, rev5) - c.Assert(putted, check.IsTrue) + require.NoError(t, err) + require.Greater(t, rev6, rev5) + require.True(t, putted) // wait for the lock operation. _, err = o.GetOperation(ctx, info2, rev5) - c.Assert(err, check.IsNil) - c.Assert(o.PendingOperation(), check.NotNil) + require.NoError(t, err) + require.NotNil(t, o.PendingOperation()) op2.Revision = rev6 - c.Assert(*o.PendingOperation(), check.DeepEquals, op2) + require.Equal(t, op2, *o.PendingOperation()) // reset the optimist. o.Reset() - c.Assert(o.PendingInfo(), check.IsNil) - c.Assert(o.PendingOperation(), check.IsNil) + require.Nil(t, o.PendingInfo()) + require.Nil(t, o.PendingOperation()) } diff --git a/dm/syncer/shardddl/pessimist_test.go b/dm/syncer/shardddl/pessimist_test.go index c54d2bb1f4..91449ffc31 100644 --- a/dm/syncer/shardddl/pessimist_test.go +++ b/dm/syncer/shardddl/pessimist_test.go @@ -18,20 +18,16 @@ import ( "testing" "time" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/common" "github.com/pingcap/tiflow/dm/pkg/log" "github.com/pingcap/tiflow/dm/pkg/shardddl/pessimism" + "github.com/stretchr/testify/require" clientv3 "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/tests/v3/integration" ) var etcdTestCli *clientv3.Client -type testPessimist struct{} - -var _ = check.Suite(&testPessimist{}) - func TestShardDDL(t *testing.T) { err := log.InitLogger(&log.Config{}) if err != nil { @@ -44,19 +40,20 @@ func TestShardDDL(t *testing.T) { etcdTestCli = mockCluster.RandClient() - check.TestingT(t) + t.Run("Pessimist", testPessimist) + t.Run("Optimist", testOptimist) } // clear keys in etcd test cluster. -func clearTestInfoOperation(c *check.C) { +func clearTestInfoOperation(t *testing.T) { clearInfo := clientv3.OpDelete(common.ShardDDLPessimismInfoKeyAdapter.Path(), clientv3.WithPrefix()) clearOp := clientv3.OpDelete(common.ShardDDLPessimismOperationKeyAdapter.Path(), clientv3.WithPrefix()) _, err := etcdTestCli.Txn(context.Background()).Then(clearInfo, clearOp).Commit() - c.Assert(err, check.IsNil) + require.NoError(t, err) } -func (t *testPessimist) TestPessimist(c *check.C) { - defer clearTestInfoOperation(c) +func testPessimist(t *testing.T) { + defer clearTestInfoOperation(t) var ( task = "task" @@ -75,84 +72,84 @@ func (t *testPessimist) TestPessimist(c *check.C) { defer cancel() // no info and operation in pending - c.Assert(p.PendingInfo(), check.IsNil) - c.Assert(p.PendingOperation(), check.IsNil) + require.Nil(t, p.PendingInfo()) + require.Nil(t, p.PendingOperation()) // put shard DDL info. rev1, err := p.PutInfo(ctx, info) - c.Assert(err, check.IsNil) - c.Assert(rev1, check.Greater, int64(0)) + require.NoError(t, err) + require.Greater(t, rev1, int64(0)) // have info in pending info2 := p.PendingInfo() - c.Assert(info2, check.NotNil) - c.Assert(*info2, check.DeepEquals, info) + require.NotNil(t, info2) + require.Equal(t, info, *info2) // put the lock operation. rev2, putted, err := pessimism.PutOperations(etcdTestCli, false, op) - c.Assert(err, check.IsNil) - c.Assert(rev2, check.Greater, rev1) - c.Assert(putted, check.IsTrue) + require.NoError(t, err) + require.Greater(t, rev2, rev1) + require.True(t, putted) // wait for the lock operation. op2, err := p.GetOperation(ctx, info, rev1) - c.Assert(err, check.IsNil) - c.Assert(op2, check.DeepEquals, op) + require.NoError(t, err) + require.Equal(t, op, op2) // have operation in pending. op3 := p.PendingOperation() - c.Assert(op3, check.NotNil) - c.Assert(*op3, check.DeepEquals, op) + require.NotNil(t, op3) + require.Equal(t, op, *op3) // mark the operation as done and delete the info. - c.Assert(p.DoneOperationDeleteInfo(op, info), check.IsNil) + require.NoError(t, p.DoneOperationDeleteInfo(op, info)) // make this op reentrant. - c.Assert(p.DoneOperationDeleteInfo(op, info), check.IsNil) + require.NoError(t, p.DoneOperationDeleteInfo(op, info)) // verify the operation and info. opc := op2 opc.Done = true opm, _, err := pessimism.GetAllOperations(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(opm, check.HasLen, 1) - c.Assert(opm[task], check.HasLen, 1) - c.Assert(opm[task][source], check.DeepEquals, opc) + require.NoError(t, err) + require.Len(t, opm, 1) + require.Len(t, opm[task], 1) + require.Equal(t, opc, opm[task][source]) ifm, _, err := pessimism.GetAllInfo(etcdTestCli) - c.Assert(err, check.IsNil) - c.Assert(ifm, check.HasLen, 0) + require.NoError(t, err) + require.Len(t, ifm, 0) // no info and operation in pending now. - c.Assert(p.PendingInfo(), check.IsNil) - c.Assert(p.PendingOperation(), check.IsNil) + require.Nil(t, p.PendingInfo()) + require.Nil(t, p.PendingOperation()) // try to put info again, but timeout because a `done` operation exist in etcd. ctx2, cancel2 := context.WithTimeout(ctx, time.Second) defer cancel2() _, err = p.PutInfo(ctx2, info) - c.Assert(err, check.Equals, context.DeadlineExceeded) + require.Equal(t, context.DeadlineExceeded, err) // start a goroutine to delete the `done` operation in background, then we can put info again. go func() { time.Sleep(500 * time.Millisecond) // wait `PutInfo` to start watch the deletion of the operation. _, err2 := pessimism.DeleteOperations(etcdTestCli, op) - c.Assert(err2, check.IsNil) + require.NoError(t, err2) }() // put info again, but do not complete the flow. _, err = p.PutInfo(ctx, info) - c.Assert(err, check.IsNil) - c.Assert(p.PendingInfo(), check.NotNil) + require.NoError(t, err) + require.NotNil(t, p.PendingInfo()) // put the lock operation again. rev3, _, err := pessimism.PutOperations(etcdTestCli, false, op) - c.Assert(err, check.IsNil) + require.NoError(t, err) // wait for the lock operation. _, err = p.GetOperation(ctx, info, rev3) - c.Assert(err, check.IsNil) - c.Assert(p.PendingOperation(), check.NotNil) + require.NoError(t, err) + require.NotNil(t, p.PendingOperation()) // reset the pessimist. p.Reset() - c.Assert(p.PendingInfo(), check.IsNil) - c.Assert(p.PendingOperation(), check.IsNil) + require.Nil(t, p.PendingInfo()) + require.Nil(t, p.PendingOperation()) } diff --git a/dm/syncer/sharding-meta/shardmeta_test.go b/dm/syncer/sharding-meta/shardmeta_test.go index a662e904d7..2940476a8a 100644 --- a/dm/syncer/sharding-meta/shardmeta_test.go +++ b/dm/syncer/sharding-meta/shardmeta_test.go @@ -18,19 +18,11 @@ import ( "testing" "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/pkg/binlog" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testShardMetaSuite{}) - -func TestSuite(t *testing.T) { - check.TestingT(t) -} - -type testShardMetaSuite struct{} - -func (t *testShardMetaSuite) TestShardingMeta(c *check.C) { +func TestShardingMeta(t *testing.T) { var ( active bool err error @@ -62,45 +54,45 @@ func (t *testShardMetaSuite) TestShardingMeta(c *check.C) { // 1st round sharding DDL sync for i := 0; i < 7; i++ { active, err = meta.AddItem(items[i]) - c.Assert(err, check.IsNil) + require.NoError(t, err) if i%3 == 0 { - c.Assert(active, check.IsTrue) + require.True(t, active) } else { - c.Assert(active, check.IsFalse) + require.False(t, active) } } - c.Assert(meta.GetGlobalItems(), check.DeepEquals, []*DDLItem{items[0], items[1], items[2]}) - c.Assert(meta.GetGlobalActiveDDL(), check.DeepEquals, items[0]) - c.Assert(meta.GetActiveDDLItem(table1), check.DeepEquals, items[0]) - c.Assert(meta.GetActiveDDLItem(table2), check.DeepEquals, items[3]) - c.Assert(meta.GetActiveDDLItem(table3), check.DeepEquals, items[6]) - c.Assert(meta.InSequenceSharding(), check.IsTrue) + require.Equal(t, []*DDLItem{items[0], items[1], items[2]}, meta.GetGlobalItems()) + require.Equal(t, items[0], meta.GetGlobalActiveDDL()) + require.Equal(t, items[0], meta.GetActiveDDLItem(table1)) + require.Equal(t, items[3], meta.GetActiveDDLItem(table2)) + require.Equal(t, items[6], meta.GetActiveDDLItem(table3)) + require.True(t, meta.InSequenceSharding()) location, err = meta.ActiveDDLFirstLocation() - c.Assert(err, check.IsNil) - c.Assert(location.Position, check.DeepEquals, items[0].FirstLocation.Position) + require.NoError(t, err) + require.Equal(t, items[0].FirstLocation.Position, location.Position) // find synced in shrading group, and call ShardingMeta.ResolveShardingDDL - c.Assert(meta.ResolveShardingDDL(), check.IsFalse) + require.False(t, meta.ResolveShardingDDL()) - c.Assert(meta.GetGlobalActiveDDL(), check.DeepEquals, items[1]) - c.Assert(meta.GetActiveDDLItem(table1), check.DeepEquals, items[1]) - c.Assert(meta.GetActiveDDLItem(table2), check.DeepEquals, items[4]) - c.Assert(meta.GetActiveDDLItem(table3), check.IsNil) - c.Assert(meta.InSequenceSharding(), check.IsTrue) + require.Equal(t, items[1], meta.GetGlobalActiveDDL()) + require.Equal(t, items[1], meta.GetActiveDDLItem(table1)) + require.Equal(t, items[4], meta.GetActiveDDLItem(table2)) + require.Nil(t, meta.GetActiveDDLItem(table3)) + require.True(t, meta.InSequenceSharding()) location, err = meta.ActiveDDLFirstLocation() - c.Assert(err, check.IsNil) - c.Assert(location.Position, check.DeepEquals, items[1].FirstLocation.Position) + require.NoError(t, err) + require.Equal(t, items[1].FirstLocation.Position, location.Position) sqls, args = meta.FlushData(sourceID, tableID) - c.Assert(sqls, check.HasLen, 4) - c.Assert(args, check.HasLen, 4) + require.Len(t, sqls, 4) + require.Len(t, args, 4) for _, stmt := range sqls { - c.Assert(stmt, check.Matches, "INSERT INTO .*") + require.Regexp(t, "INSERT INTO .*", stmt) } for _, arg := range args { - c.Assert(arg, check.HasLen, 8) - c.Assert(arg[3], check.Equals, 1) + require.Len(t, arg, 8) + require.Equal(t, 1, arg[3]) } // 2nd round sharding DDL sync @@ -109,44 +101,44 @@ func (t *testShardMetaSuite) TestShardingMeta(c *check.C) { continue } active, err = meta.AddItem(items[i]) - c.Assert(err, check.IsNil) + require.NoError(t, err) if i%3 == 1 { - c.Assert(active, check.IsTrue) + require.True(t, active) } else { - c.Assert(active, check.IsFalse) + require.False(t, active) } } - c.Assert(meta.GetGlobalActiveDDL(), check.DeepEquals, items[1]) - c.Assert(meta.GetActiveDDLItem(table1), check.DeepEquals, items[1]) - c.Assert(meta.GetActiveDDLItem(table2), check.DeepEquals, items[4]) - c.Assert(meta.GetActiveDDLItem(table3), check.DeepEquals, items[7]) - c.Assert(meta.InSequenceSharding(), check.IsTrue) + require.Equal(t, items[1], meta.GetGlobalActiveDDL()) + require.Equal(t, items[1], meta.GetActiveDDLItem(table1)) + require.Equal(t, items[4], meta.GetActiveDDLItem(table2)) + require.Equal(t, items[7], meta.GetActiveDDLItem(table3)) + require.True(t, meta.InSequenceSharding()) location, err = meta.ActiveDDLFirstLocation() - c.Assert(err, check.IsNil) - c.Assert(location.Position, check.DeepEquals, items[1].FirstLocation.Position) + require.NoError(t, err) + require.Equal(t, items[1].FirstLocation.Position, location.Position) // find synced in shrading group, and call ShardingMeta.ResolveShardingDDL - c.Assert(meta.ResolveShardingDDL(), check.IsFalse) + require.False(t, meta.ResolveShardingDDL()) - c.Assert(meta.GetGlobalActiveDDL(), check.DeepEquals, items[2]) - c.Assert(meta.GetActiveDDLItem(table1), check.DeepEquals, items[2]) - c.Assert(meta.GetActiveDDLItem(table2), check.DeepEquals, items[5]) - c.Assert(meta.GetActiveDDLItem(table3), check.IsNil) - c.Assert(meta.InSequenceSharding(), check.IsTrue) + require.Equal(t, items[2], meta.GetGlobalActiveDDL()) + require.Equal(t, items[2], meta.GetActiveDDLItem(table1)) + require.Equal(t, items[5], meta.GetActiveDDLItem(table2)) + require.Nil(t, meta.GetActiveDDLItem(table3)) + require.True(t, meta.InSequenceSharding()) location, err = meta.ActiveDDLFirstLocation() - c.Assert(err, check.IsNil) - c.Assert(location.Position, check.DeepEquals, items[2].FirstLocation.Position) + require.NoError(t, err) + require.Equal(t, items[2].FirstLocation.Position, location.Position) sqls, args = meta.FlushData(sourceID, tableID) - c.Assert(sqls, check.HasLen, 4) - c.Assert(args, check.HasLen, 4) + require.Len(t, sqls, 4) + require.Len(t, args, 4) for _, stmt := range sqls { - c.Assert(stmt, check.Matches, "INSERT INTO .*") + require.Regexp(t, "INSERT INTO .*", stmt) } for _, arg := range args { - c.Assert(arg, check.HasLen, 8) - c.Assert(arg[3], check.Equals, 2) + require.Len(t, arg, 8) + require.Equal(t, 2, arg[3]) } // 3rd round sharding DDL sync @@ -155,41 +147,42 @@ func (t *testShardMetaSuite) TestShardingMeta(c *check.C) { continue } active, err = meta.AddItem(items[i]) - c.Assert(err, check.IsNil) + require.NoError(t, err) if i%3 == 2 { - c.Assert(active, check.IsTrue) + require.True(t, active) } else { - c.Assert(active, check.IsFalse) + require.False(t, active) } } - c.Assert(meta.GetGlobalActiveDDL(), check.DeepEquals, items[2]) - c.Assert(meta.GetActiveDDLItem(table1), check.DeepEquals, items[2]) - c.Assert(meta.GetActiveDDLItem(table2), check.DeepEquals, items[5]) - c.Assert(meta.GetActiveDDLItem(table3), check.DeepEquals, items[8]) - c.Assert(meta.InSequenceSharding(), check.IsTrue) + require.Equal(t, items[2], meta.GetGlobalActiveDDL()) + require.Equal(t, items[2], meta.GetActiveDDLItem(table1)) + require.Equal(t, items[5], meta.GetActiveDDLItem(table2)) + require.Equal(t, items[8], meta.GetActiveDDLItem(table3)) + require.True(t, meta.InSequenceSharding()) location, err = meta.ActiveDDLFirstLocation() - c.Assert(err, check.IsNil) - c.Assert(location.Position, check.DeepEquals, items[2].FirstLocation.Position) + require.NoError(t, err) + require.Equal(t, items[2].FirstLocation.Position, location.Position) // find synced in shrading group, and call ShardingMeta.ResolveShardingDDL - c.Assert(meta.ResolveShardingDDL(), check.IsTrue) + require.True(t, meta.ResolveShardingDDL()) - c.Assert(meta.GetGlobalActiveDDL(), check.IsNil) - c.Assert(meta.GetActiveDDLItem(table1), check.IsNil) - c.Assert(meta.GetActiveDDLItem(table2), check.IsNil) - c.Assert(meta.GetActiveDDLItem(table3), check.IsNil) - c.Assert(meta.InSequenceSharding(), check.IsFalse) + require.Nil(t, meta.GetGlobalActiveDDL()) + require.Nil(t, meta.GetActiveDDLItem(table1)) + require.Nil(t, meta.GetActiveDDLItem(table2)) + require.Nil(t, meta.GetActiveDDLItem(table3)) + require.False(t, meta.InSequenceSharding()) _, err = meta.ActiveDDLFirstLocation() - c.Assert(err, check.ErrorMatches, fmt.Sprintf("\\[.*\\], Message: activeIdx %d larger than length of global DDLItems: .*", meta.ActiveIdx())) + require.Error(t, err) + require.Regexp(t, fmt.Sprintf("\\[.*\\], Message: activeIdx %d larger than length of global DDLItems: .*", meta.ActiveIdx()), err.Error()) sqls, args = meta.FlushData(sourceID, tableID) - c.Assert(sqls, check.HasLen, 1) - c.Assert(args, check.HasLen, 1) - c.Assert(sqls[0], check.Matches, "DELETE FROM .*") - c.Assert(args[0], check.DeepEquals, []interface{}{sourceID, tableID}) + require.Len(t, sqls, 1) + require.Len(t, args, 1) + require.Regexp(t, "DELETE FROM .*", sqls[0]) + require.Equal(t, []interface{}{sourceID, tableID}, args[0]) } -func (t *testShardMetaSuite) TestShardingMetaWrongSequence(c *check.C) { +func TestShardingMetaWrongSequence(t *testing.T) { var ( active bool err error @@ -210,15 +203,15 @@ func (t *testShardMetaSuite) TestShardingMetaWrongSequence(c *check.C) { // 1st round sharding DDL sync for i := 0; i < 4; i++ { active, err = meta.AddItem(items[i]) - c.Assert(err, check.IsNil) + require.NoError(t, err) if i%3 == 0 { - c.Assert(active, check.IsTrue) + require.True(t, active) } else { - c.Assert(active, check.IsFalse) + require.False(t, active) } } // find synced in shrading group, and call ShardingMeta.ResolveShardingDDL - c.Assert(meta.ResolveShardingDDL(), check.IsFalse) + require.False(t, meta.ResolveShardingDDL()) // 2nd round sharding DDL sync for i := 0; i < 4; i++ { @@ -226,19 +219,20 @@ func (t *testShardMetaSuite) TestShardingMetaWrongSequence(c *check.C) { continue } active, err = meta.AddItem(items[i]) - c.Assert(err, check.IsNil) + require.NoError(t, err) if i%3 == 1 { - c.Assert(active, check.IsTrue) + require.True(t, active) } else { - c.Assert(active, check.IsFalse) + require.False(t, active) } } active, err = meta.AddItem(items[4]) - c.Assert(active, check.IsFalse) - c.Assert(err, check.ErrorMatches, "\\[.*\\], Message: detect inconsistent DDL sequence from source .*, right DDL sequence should be .*") + require.False(t, active) + require.Error(t, err) + require.Regexp(t, "\\[.*\\], Message: detect inconsistent DDL sequence from source .*, right DDL sequence should be .*", err.Error()) } -func (t *testShardMetaSuite) TestFlushLoadMeta(c *check.C) { +func TestFlushLoadMeta(t *testing.T) { var ( active bool err error @@ -258,21 +252,21 @@ func (t *testShardMetaSuite) TestFlushLoadMeta(c *check.C) { ) for _, item := range items { active, err = meta.AddItem(item) - c.Assert(err, check.IsNil) - c.Assert(active, check.IsTrue) + require.NoError(t, err) + require.True(t, active) } sqls, args := meta.FlushData(sourceID, tableID) - c.Assert(sqls, check.HasLen, 3) - c.Assert(args, check.HasLen, 3) + require.Len(t, sqls, 3) + require.Len(t, args, 3) for _, arg := range args { - c.Assert(arg, check.HasLen, 8) - c.Assert(loadedMeta.RestoreFromData(arg[2].(string), arg[3].(int), arg[4].(bool), []byte(arg[5].(string)), mysql.MySQLFlavor), check.IsNil) + require.Len(t, arg, 8) + require.NoError(t, loadedMeta.RestoreFromData(arg[2].(string), arg[3].(int), arg[4].(bool), []byte(arg[5].(string)), mysql.MySQLFlavor)) } - c.Assert(loadedMeta.activeIdx, check.Equals, meta.activeIdx) - c.Assert(loadedMeta.global.String(), check.Equals, meta.global.String()) - c.Assert(loadedMeta.tableName, check.Equals, meta.tableName) - c.Assert(len(loadedMeta.sources), check.Equals, len(meta.sources)) + require.Equal(t, meta.activeIdx, loadedMeta.activeIdx) + require.Equal(t, meta.global.String(), loadedMeta.global.String()) + require.Equal(t, meta.tableName, loadedMeta.tableName) + require.Equal(t, len(meta.sources), len(loadedMeta.sources)) for table, source := range loadedMeta.sources { - c.Assert(source.String(), check.Equals, meta.sources[table].String()) + require.Equal(t, meta.sources[table].String(), source.String()) } } diff --git a/dm/syncer/sharding_group_test.go b/dm/syncer/sharding_group_test.go index e2d70ef5bd..1d5a81277c 100644 --- a/dm/syncer/sharding_group_test.go +++ b/dm/syncer/sharding_group_test.go @@ -20,7 +20,6 @@ import ( "github.com/DATA-DOG/go-sqlmock" "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/util/dbutil" "github.com/pingcap/tidb/pkg/util/filter" "github.com/pingcap/tiflow/dm/config" @@ -33,10 +32,9 @@ import ( "github.com/pingcap/tiflow/dm/pkg/terror" "github.com/pingcap/tiflow/dm/pkg/utils" "github.com/pingcap/tiflow/dm/syncer/dbconn" + "github.com/stretchr/testify/suite" ) -var _ = check.Suite(&testShardingGroupSuite{}) - var ( targetTbl = &filter.Table{ Schema: "target_db", @@ -66,10 +64,11 @@ var ( ) type testShardingGroupSuite struct { + suite.Suite cfg *config.SubTaskConfig } -func (t *testShardingGroupSuite) SetUpSuite(c *check.C) { +func (t *testShardingGroupSuite) SetupSuite() { t.cfg = &config.SubTaskConfig{ SourceID: "mysql-replica-01", MetaSchema: "test", @@ -77,100 +76,100 @@ func (t *testShardingGroupSuite) SetUpSuite(c *check.C) { } } -func (t *testShardingGroupSuite) TestLowestFirstPosInGroups(c *check.C) { +func (t *testShardingGroupSuite) TestLowestFirstPosInGroups() { k := NewShardingGroupKeeper(tcontext.Background(), t.cfg, nil) g1 := NewShardingGroup(k.cfg.SourceID, k.shardMetaSchema, k.shardMetaTable, []string{"db1.tbl1", "db1.tbl2"}, nil, false, "", false) // nolint:dogsled _, _, _, err := g1.TrySync("db1.tbl1", pos11, endPos11, ddls1) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // lowest g2 := NewShardingGroup(k.cfg.SourceID, k.shardMetaSchema, k.shardMetaTable, []string{"db2.tbl1", "db2.tbl2"}, nil, false, "", false) // nolint:dogsled _, _, _, err = g2.TrySync("db2.tbl1", pos21, endPos21, ddls1) - c.Assert(err, check.IsNil) + t.Require().NoError(err) g3 := NewShardingGroup(k.cfg.SourceID, k.shardMetaSchema, k.shardMetaTable, []string{"db3.tbl1", "db3.tbl2"}, nil, false, "", false) // nolint:dogsled _, _, _, err = g3.TrySync("db3.tbl1", pos3, endPos3, ddls1) - c.Assert(err, check.IsNil) + t.Require().NoError(err) k.groups["db1.tbl"] = g1 k.groups["db2.tbl"] = g2 k.groups["db3.tbl"] = g3 - c.Assert(k.lowestFirstLocationInGroups().Position, check.DeepEquals, pos21.Position) + t.Require().Equal(pos21.Position, k.lowestFirstLocationInGroups().Position) } -func (t *testShardingGroupSuite) TestMergeAndLeave(c *check.C) { +func (t *testShardingGroupSuite) TestMergeAndLeave() { k := NewShardingGroupKeeper(tcontext.Background(), t.cfg, nil) g1 := NewShardingGroup(k.cfg.SourceID, k.shardMetaSchema, k.shardMetaTable, []string{source1, source2}, nil, false, "", false) - c.Assert(g1.Sources(), check.DeepEquals, map[string]bool{source1: false, source2: false}) + t.Require().Equal(map[string]bool{source1: false, source2: false}, g1.Sources()) needShardingHandle, synced, remain, err := g1.Merge([]string{source3}) - c.Assert(err, check.IsNil) - c.Assert(needShardingHandle, check.IsFalse) - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 3) + t.Require().NoError(err) + t.Require().False(needShardingHandle) + t.Require().False(synced) + t.Require().Equal(3, remain) // repeat merge has no side effect needShardingHandle, synced, remain, err = g1.Merge([]string{source3}) - c.Assert(err, check.IsNil) - c.Assert(needShardingHandle, check.IsFalse) - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 3) + t.Require().NoError(err) + t.Require().False(needShardingHandle) + t.Require().False(synced) + t.Require().Equal(3, remain) err = g1.Leave([]string{source1}) - c.Assert(err, check.IsNil) - c.Assert(g1.Sources(), check.DeepEquals, map[string]bool{source3: false, source2: false}) + t.Require().NoError(err) + t.Require().Equal(map[string]bool{source3: false, source2: false}, g1.Sources()) // repeat leave has no side effect err = g1.Leave([]string{source1}) - c.Assert(err, check.IsNil) - c.Assert(g1.Sources(), check.DeepEquals, map[string]bool{source3: false, source2: false}) + t.Require().NoError(err) + t.Require().Equal(map[string]bool{source3: false, source2: false}, g1.Sources()) ddls := []string{"DUMMY DDL"} pos1 := mysql.Position{Name: "mysql-bin.000002", Pos: 123} endPos1 := mysql.Position{Name: "mysql-bin.000002", Pos: 456} // nolint:dogsled _, _, _, err = g1.TrySync(source1, binlog.Location{Position: pos1}, binlog.Location{Position: endPos1}, ddls) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // nolint:dogsled _, _, _, err = g1.Merge([]string{source1}) - c.Assert(terror.ErrSyncUnitAddTableInSharding.Equal(err), check.IsTrue) + t.Require().True(terror.ErrSyncUnitAddTableInSharding.Equal(err)) err = g1.Leave([]string{source2}) - c.Assert(terror.ErrSyncUnitDropSchemaTableInSharding.Equal(err), check.IsTrue) + t.Require().True(terror.ErrSyncUnitDropSchemaTableInSharding.Equal(err)) } -func (t *testShardingGroupSuite) TestSync(c *check.C) { +func (t *testShardingGroupSuite) TestSync() { k := NewShardingGroupKeeper(tcontext.Background(), t.cfg, nil) g1 := NewShardingGroup(k.cfg.SourceID, k.shardMetaSchema, k.shardMetaTable, []string{source1, source2}, nil, false, "", false) synced, active, remain, err := g1.TrySync(source1, pos11, endPos11, ddls1) - c.Assert(err, check.IsNil) - c.Assert(synced, check.IsFalse) - c.Assert(active, check.IsTrue) - c.Assert(remain, check.Equals, 1) + t.Require().NoError(err) + t.Require().False(synced) + t.Require().True(active) + t.Require().Equal(1, remain) synced, active, remain, err = g1.TrySync(source1, pos12, endPos12, ddls2) - c.Assert(err, check.IsNil) - c.Assert(synced, check.IsFalse) - c.Assert(active, check.IsFalse) - c.Assert(remain, check.Equals, 1) + t.Require().NoError(err) + t.Require().False(synced) + t.Require().False(active) + t.Require().Equal(1, remain) - c.Assert(g1.FirstLocationUnresolved(), check.DeepEquals, &pos11) - c.Assert(g1.FirstEndPosUnresolved(), check.DeepEquals, &endPos11) + t.Require().Equal(&pos11, g1.FirstLocationUnresolved()) + t.Require().Equal(&endPos11, g1.FirstEndPosUnresolved()) loc, err := g1.ActiveDDLFirstLocation() - c.Assert(err, check.IsNil) - c.Assert(loc, check.DeepEquals, pos11) + t.Require().NoError(err) + t.Require().Equal(pos11, loc) // not call `TrySync` for source2, beforeActiveDDL is always true beforeActiveDDL := g1.CheckSyncing(source2, pos21) - c.Assert(beforeActiveDDL, check.IsTrue) + t.Require().True(beforeActiveDDL) info := g1.UnresolvedGroupInfo() shouldBe := &pb.ShardingGroup{Target: "", DDLs: ddls1, FirstLocation: pos11.String(), Synced: []string{source1}, Unsynced: []string{source2}} - c.Assert(info, check.DeepEquals, shouldBe) + t.Require().Equal(shouldBe, info) // simple sort for [][]string{[]string{"db1", "tbl2"}, []string{"db1", "tbl1"}} tbls1 := g1.Tables() @@ -178,48 +177,48 @@ func (t *testShardingGroupSuite) TestSync(c *check.C) { if tbls1[0].Name != tbls2[0].Name { tbls1[0], tbls1[1] = tbls1[1], tbls1[0] } - c.Assert(tbls1, check.DeepEquals, tbls2) + t.Require().Equal(tbls2, tbls1) // sync first DDL for source2, synced but not resolved synced, active, remain, err = g1.TrySync(source2, pos21, endPos21, ddls1) - c.Assert(err, check.IsNil) - c.Assert(synced, check.IsTrue) - c.Assert(active, check.IsTrue) - c.Assert(remain, check.Equals, 0) + t.Require().NoError(err) + t.Require().True(synced) + t.Require().True(active) + t.Require().Equal(0, remain) // active DDL is at pos21 beforeActiveDDL = g1.CheckSyncing(source2, pos21) - c.Assert(beforeActiveDDL, check.IsTrue) + t.Require().True(beforeActiveDDL) info = g1.UnresolvedGroupInfo() sort.Strings(info.Synced) shouldBe = &pb.ShardingGroup{Target: "", DDLs: ddls1, FirstLocation: pos11.String(), Synced: []string{source1, source2}, Unsynced: []string{}} - c.Assert(info, check.DeepEquals, shouldBe) + t.Require().Equal(shouldBe, info) resolved := g1.ResolveShardingDDL() - c.Assert(resolved, check.IsFalse) + t.Require().False(resolved) // next active DDL not present beforeActiveDDL = g1.CheckSyncing(source2, pos21) - c.Assert(beforeActiveDDL, check.IsTrue) + t.Require().True(beforeActiveDDL) synced, active, remain, err = g1.TrySync(source2, pos22, endPos22, ddls2) - c.Assert(err, check.IsNil) - c.Assert(synced, check.IsTrue) - c.Assert(active, check.IsTrue) - c.Assert(remain, check.Equals, 0) + t.Require().NoError(err) + t.Require().True(synced) + t.Require().True(active) + t.Require().Equal(0, remain) resolved = g1.ResolveShardingDDL() - c.Assert(resolved, check.IsTrue) + t.Require().True(resolved) // caller should reset sharding group if DDL is successful executed g1.Reset() info = g1.UnresolvedGroupInfo() - c.Assert(info, check.IsNil) - c.Assert(g1.UnresolvedTables(), check.IsNil) + t.Require().Nil(info) + t.Require().Nil(g1.UnresolvedTables()) } -func (t *testShardingGroupSuite) TestTableID(c *check.C) { +func (t *testShardingGroupSuite) TestTableID() { originTables := []*filter.Table{ {Schema: "db", Name: "table"}, {Schema: `d"b`, Name: `t"able"`}, @@ -229,17 +228,17 @@ func (t *testShardingGroupSuite) TestTableID(c *check.C) { // ignore isSchemaOnly tableID := utils.GenTableID(originTable) table := utils.UnpackTableID(tableID) - c.Assert(table, check.DeepEquals, originTable) + t.Require().Equal(originTable, table) } } -func (t *testShardingGroupSuite) TestKeeper(c *check.C) { +func (t *testShardingGroupSuite) TestKeeper() { k := NewShardingGroupKeeper(tcontext.Background(), t.cfg, nil) k.clear() db, mock, err := sqlmock.New() - c.Assert(err, check.IsNil) + t.Require().NoError(err) dbConn, err := db.Conn(context.Background()) - c.Assert(err, check.IsNil) + t.Require().NoError(err) k.db = conn.NewBaseDBForTest(db) k.dbConn = dbconn.NewDBConn(t.cfg, conn.NewBaseConnForTest(dbConn, &retry.FiniteRetryStrategy{})) mock.ExpectBegin() @@ -248,107 +247,107 @@ func (t *testShardingGroupSuite) TestKeeper(c *check.C) { mock.ExpectBegin() mock.ExpectExec(fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s.*", dbutil.TableName(t.cfg.MetaSchema, cputil.SyncerShardMeta(t.cfg.Name)))).WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectCommit() - c.Assert(k.prepare(), check.IsNil) + t.Require().Nil(k.prepare()) // test meta mock.ExpectQuery(" SELECT `target_table_id`, `source_table_id`, `active_index`, `is_global`, `data` FROM `test`.`checkpoint_ut_syncer_sharding_meta`.*"). WillReturnRows(sqlmock.NewRows([]string{"target_table_id", "source_table_id", "active_index", "is_global", "data"})) meta, err := k.LoadShardMeta(mysql.MySQLFlavor, false) - c.Assert(err, check.IsNil) - c.Assert(meta, check.HasLen, 0) + t.Require().NoError(err) + t.Require().Len(meta, 0) mock.ExpectQuery(" SELECT `target_table_id`, `source_table_id`, `active_index`, `is_global`, `data` FROM `test`.`checkpoint_ut_syncer_sharding_meta`.*"). WillReturnRows(sqlmock.NewRows([]string{"target_table_id", "source_table_id", "active_index", "is_global", "data"}). AddRow(target, "", 0, true, "[{\"ddls\":[\"DUMMY DDL\"],\"source\":\"`db1`.`tbl1`\",\"first-position\":{\"Name\":\"mysql-bin.000002\",\"Pos\":123},\"first-gtid-set\":\"\"},{\"ddls\":[\"ANOTHER DUMMY DDL\"],\"source\":\"`db1`.`tbl1`\",\"first-position\":{\"Name\":\"mysql-bin.000002\",\"Pos\":789},\"first-gtid-set\":\"\"}]"). AddRow(target, source1, 0, false, "[{\"ddls\":[\"DUMMY DDL\"],\"source\":\"`db1`.`tbl1`\",\"first-position\":{\"Name\":\"mysql-bin.000002\",\"Pos\":123},\"first-gtid-set\":\"\"},{\"ddls\":[\"ANOTHER DUMMY DDL\"],\"source\":\"`db1`.`tbl1`\",\"first-position\":{\"Name\":\"mysql-bin.000002\",\"Pos\":789},\"first-gtid-set\":\"\"}]")) meta, err = k.LoadShardMeta(mysql.MySQLFlavor, false) - c.Assert(err, check.IsNil) - c.Assert(meta, check.HasLen, 1) // has meta of `target` + t.Require().NoError(err) + t.Require().Len(meta, 1) // has meta of `target` // test AddGroup and LeaveGroup needShardingHandle, group, synced, remain, err := k.AddGroup(targetTbl, []string{source1}, nil, true) - c.Assert(err, check.IsNil) - c.Assert(needShardingHandle, check.IsFalse) - c.Assert(group, check.NotNil) - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 0) // first time doesn't return `remain` + t.Require().NoError(err) + t.Require().False(needShardingHandle) + t.Require().NotNil(group) + t.Require().False(synced) + t.Require().Equal(0, remain) // first time doesn't return `remain` needShardingHandle, group, synced, remain, err = k.AddGroup(targetTbl, []string{source2}, nil, true) - c.Assert(err, check.IsNil) - c.Assert(needShardingHandle, check.IsFalse) - c.Assert(group, check.NotNil) - c.Assert(synced, check.IsFalse) - c.Assert(remain, check.Equals, 2) + t.Require().NoError(err) + t.Require().False(needShardingHandle) + t.Require().NotNil(group) + t.Require().False(synced) + t.Require().Equal(2, remain) // test LeaveGroup // nolint:dogsled _, _, _, remain, err = k.AddGroup(targetTbl, []string{source3}, nil, true) - c.Assert(err, check.IsNil) - c.Assert(remain, check.Equals, 3) + t.Require().NoError(err) + t.Require().Equal(3, remain) // nolint:dogsled _, _, _, remain, err = k.AddGroup(targetTbl, []string{source4}, nil, true) - c.Assert(err, check.IsNil) - c.Assert(remain, check.Equals, 4) - c.Assert(k.LeaveGroup(targetTbl, []string{source3, source4}), check.IsNil) + t.Require().NoError(err) + t.Require().Equal(4, remain) + t.Require().Nil(k.LeaveGroup(targetTbl, []string{source3, source4})) // test TrySync and InSyncing needShardingHandle, group, synced, active, remain, err := k.TrySync(sourceTbl1, targetTbl, pos12, endPos12, ddls1) - c.Assert(err, check.IsNil) - c.Assert(needShardingHandle, check.IsTrue) - c.Assert(group.sources, check.DeepEquals, map[string]bool{source1: true, source2: false}) - c.Assert(synced, check.IsFalse) - c.Assert(active, check.IsTrue) - c.Assert(remain, check.Equals, 1) - - c.Assert(k.InSyncing(sourceTbl1, &filter.Table{Schema: targetTbl.Schema, Name: "wrong table"}, pos11), check.IsFalse) + t.Require().NoError(err) + t.Require().True(needShardingHandle) + t.Require().Equal(map[string]bool{source1: true, source2: false}, group.sources) + t.Require().False(synced) + t.Require().True(active) + t.Require().Equal(1, remain) + + t.Require().False(k.InSyncing(sourceTbl1, &filter.Table{Schema: targetTbl.Schema, Name: "wrong table"}, pos11)) loc, err := k.ActiveDDLFirstLocation(targetTbl) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // position before active DDL, not in syncing - c.Assert(binlog.CompareLocation(endPos11, loc, false), check.Equals, -1) - c.Assert(k.InSyncing(sourceTbl1, targetTbl, endPos11), check.IsFalse) + t.Require().Equal(-1, binlog.CompareLocation(endPos11, loc, false)) + t.Require().False(k.InSyncing(sourceTbl1, targetTbl, endPos11)) // position at/after active DDL, in syncing - c.Assert(binlog.CompareLocation(pos12, loc, false), check.Equals, 0) - c.Assert(k.InSyncing(sourceTbl1, targetTbl, pos12), check.IsFalse) - c.Assert(binlog.CompareLocation(endPos12, loc, false), check.Equals, 1) - c.Assert(k.InSyncing(sourceTbl1, targetTbl, endPos12), check.IsTrue) + t.Require().Equal(0, binlog.CompareLocation(pos12, loc, false)) + t.Require().False(k.InSyncing(sourceTbl1, targetTbl, pos12)) + t.Require().Equal(1, binlog.CompareLocation(endPos12, loc, false)) + t.Require().True(k.InSyncing(sourceTbl1, targetTbl, endPos12)) needShardingHandle, group, synced, active, remain, err = k.TrySync(sourceTbl2, targetTbl, pos21, endPos21, ddls1) - c.Assert(err, check.IsNil) - c.Assert(needShardingHandle, check.IsTrue) - c.Assert(group.sources, check.DeepEquals, map[string]bool{source1: true, source2: true}) - c.Assert(synced, check.IsTrue) - c.Assert(active, check.IsTrue) - c.Assert(remain, check.Equals, 0) + t.Require().NoError(err) + t.Require().True(needShardingHandle) + t.Require().Equal(map[string]bool{source1: true, source2: true}, group.sources) + t.Require().True(synced) + t.Require().True(active) + t.Require().Equal(0, remain) unresolvedTarget, unresolvedTables := k.UnresolvedTables() - c.Assert(unresolvedTarget, check.DeepEquals, map[string]bool{target: true}) + t.Require().Equal(map[string]bool{target: true}, unresolvedTarget) // simple re-order if unresolvedTables[0].Name > unresolvedTables[1].Name { unresolvedTables[0], unresolvedTables[1] = unresolvedTables[1], unresolvedTables[0] } - c.Assert(unresolvedTables, check.DeepEquals, []*filter.Table{sourceTbl1, sourceTbl2}) + t.Require().Equal([]*filter.Table{sourceTbl1, sourceTbl2}, unresolvedTables) unresolvedGroups := k.UnresolvedGroups() - c.Assert(unresolvedGroups, check.HasLen, 1) + t.Require().Len(unresolvedGroups, 1) g := unresolvedGroups[0] - c.Assert(g.Unsynced, check.HasLen, 0) - c.Assert(g.DDLs, check.DeepEquals, ddls1) - c.Assert(g.FirstLocation, check.DeepEquals, pos12.String()) + t.Require().Len(g.Unsynced, 0) + t.Require().Equal(ddls1, g.DDLs) + t.Require().Equal(pos12.String(), g.FirstLocation) sqls, args := k.PrepareFlushSQLs(unresolvedTarget) - c.Assert(sqls, check.HasLen, 0) - c.Assert(args, check.HasLen, 0) + t.Require().Len(sqls, 0) + t.Require().Len(args, 0) reset, err := k.ResolveShardingDDL(targetTbl) - c.Assert(err, check.IsNil) - c.Assert(reset, check.IsTrue) + t.Require().NoError(err) + t.Require().True(reset) k.ResetGroups() unresolvedTarget, unresolvedTables = k.UnresolvedTables() - c.Assert(unresolvedTarget, check.HasLen, 0) - c.Assert(unresolvedTables, check.HasLen, 0) + t.Require().Len(unresolvedTarget, 0) + t.Require().Len(unresolvedTables, 0) } diff --git a/dm/syncer/status_test.go b/dm/syncer/status_test.go index c346654be3..6a0fadc09f 100644 --- a/dm/syncer/status_test.go +++ b/dm/syncer/status_test.go @@ -15,9 +15,9 @@ package syncer import ( "sync" + "testing" "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/meta/model" "github.com/pingcap/tidb/pkg/util/filter" "github.com/pingcap/tiflow/dm/config" @@ -27,14 +27,11 @@ import ( "github.com/pingcap/tiflow/dm/pkg/log" "github.com/pingcap/tiflow/dm/syncer/metrics" "github.com/pingcap/tiflow/dm/syncer/shardddl" + "github.com/stretchr/testify/require" "go.uber.org/zap" ) -var _ = check.Suite(&statusSuite{}) - -type statusSuite struct{} - -func (t *statusSuite) TestStatusRace(c *check.C) { +func TestStatusRace(t *testing.T) { s := &Syncer{} l := log.With(zap.String("unit test", "TestStatueRace")) @@ -62,8 +59,8 @@ func (t *statusSuite) TestStatusRace(c *check.C) { defer wg.Done() ret := s.Status(sourceStatus) status := ret.(*pb.SyncStatus) - c.Assert(status.MasterBinlog, check.Equals, "(mysql-bin.000123, 223)") - c.Assert(status.SyncerBinlog, check.Equals, "(mysql-bin.000123, 123)") + require.Equal(t, "(mysql-bin.000123, 223)", status.MasterBinlog) + require.Equal(t, "(mysql-bin.000123, 123)", status.SyncerBinlog) }() } wg.Wait() diff --git a/dm/syncer/syncer_test.go b/dm/syncer/syncer_test.go index 1366cd9bc2..f563e2d91d 100644 --- a/dm/syncer/syncer_test.go +++ b/dm/syncer/syncer_test.go @@ -29,7 +29,6 @@ import ( "github.com/go-mysql-org/go-mysql/mysql" "github.com/go-mysql-org/go-mysql/replication" _ "github.com/go-sql-driver/mysql" - "github.com/pingcap/check" "github.com/pingcap/failpoint" pclog "github.com/pingcap/log" "github.com/pingcap/tidb/pkg/infoschema" @@ -62,14 +61,16 @@ import ( "github.com/pingcap/tiflow/pkg/errorutil" "github.com/pingcap/tiflow/pkg/sqlmodel" "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "go.uber.org/zap" "go.uber.org/zap/zaptest/observer" ) -var _ = check.Suite(&testSyncerSuite{}) - func TestSuite(t *testing.T) { - check.TestingT(t) + suite.Run(t, new(testSyncerSuite)) + suite.Run(t, new(testFilterSuite)) + suite.Run(t, new(testShardingGroupSuite)) + suite.Run(t, new(testCheckpointSuite)) } type ( @@ -99,6 +100,7 @@ const ( ) type testSyncerSuite struct { + suite.Suite cfg *config.SubTaskConfig eventsGenerator *event.Generator } @@ -141,36 +143,36 @@ func (mp *MockStreamProducer) GenerateStreamFrom(location binlog.Location) (read return &MockStreamer{mp.events, idx, false}, nil } -func (s *testSyncerSuite) SetUpSuite(c *check.C) { +func (s *testSyncerSuite) SetupSuite() { s.cfg = genDefaultSubTaskConfig4Test() - s.resetEventsGenerator(c) - c.Assert(log.InitLogger(&log.Config{}), check.IsNil) + s.resetEventsGenerator() + s.Require().Nil(log.InitLogger(&log.Config{})) } -func (s *testSyncerSuite) generateEvents(binlogEvents mockBinlogEvents, c *check.C) []*replication.BinlogEvent { +func (s *testSyncerSuite) generateEvents(binlogEvents mockBinlogEvents) []*replication.BinlogEvent { events := make([]*replication.BinlogEvent, 0, 1024) for _, e := range binlogEvents { switch e.typ { case DBCreate: evs, _, err := s.eventsGenerator.GenCreateDatabaseEvents(e.args[0].(string)) - c.Assert(err, check.IsNil) + s.Require().NoError(err) events = append(events, evs...) case DBDrop: evs, _, err := s.eventsGenerator.GenDropDatabaseEvents(e.args[0].(string)) - c.Assert(err, check.IsNil) + s.Require().NoError(err) events = append(events, evs...) case TableCreate: evs, _, err := s.eventsGenerator.GenCreateTableEvents(e.args[0].(string), e.args[1].(string)) - c.Assert(err, check.IsNil) + s.Require().NoError(err) events = append(events, evs...) case TableDrop: evs, _, err := s.eventsGenerator.GenDropTableEvents(e.args[0].(string), e.args[1].(string)) - c.Assert(err, check.IsNil) + s.Require().NoError(err) events = append(events, evs...) case DDL: evs, _, err := s.eventsGenerator.GenDDLEvents(e.args[0].(string), e.args[1].(string), 0) - c.Assert(err, check.IsNil) + s.Require().NoError(err) events = append(events, evs...) case Write, Update, Delete: @@ -192,36 +194,36 @@ func (s *testSyncerSuite) generateEvents(binlogEvents mockBinlogEvents, c *check case Delete: eventType = replication.DELETE_ROWS_EVENTv2 default: - c.Fatal(fmt.Sprintf("mock event generator don't support event type: %d", e.typ)) + s.T().Fatal(fmt.Sprintf("mock event generator don't support event type: %d", e.typ)) } evs, _, err := s.eventsGenerator.GenDMLEvents(eventType, dmlData, 0) - c.Assert(err, check.IsNil) + s.Require().NoError(err) events = append(events, evs...) } } return events } -func (s *testSyncerSuite) resetEventsGenerator(c *check.C) { +func (s *testSyncerSuite) resetEventsGenerator() { previousGTIDSetStr := "3ccc475b-2343-11e7-be21-6c0b84d59f30:1-14,406a3f61-690d-11e7-87c5-6c92bf46f384:1-94321383" previousGTIDSet, err := gtid.ParserGTID(s.cfg.Flavor, previousGTIDSetStr) if err != nil { - c.Fatal(err) + s.T().Fatal(err) } latestGTIDStr := "3ccc475b-2343-11e7-be21-6c0b84d59f30:14" latestGTID, err := gtid.ParserGTID(s.cfg.Flavor, latestGTIDStr) - c.Assert(err, check.IsNil) + s.Require().NoError(err) s.eventsGenerator, err = event.NewGenerator(s.cfg.Flavor, s.cfg.ServerID, 0, latestGTID, previousGTIDSet, 0) if err != nil { - c.Fatal(err) + s.T().Fatal(err) } } -func (s *testSyncerSuite) TearDownSuite(c *check.C) { +func (s *testSyncerSuite) TearDownSuite() { os.RemoveAll(s.cfg.Dir) } -func (s *testSyncerSuite) TestSampleUnhandledEvents(c *check.C) { +func (s *testSyncerSuite) TestSampleUnhandledEvents() { core, logs := observer.New(zap.WarnLevel) restoreGlobal := pclog.ReplaceGlobals(zap.New(core), nil) defer restoreGlobal() @@ -235,22 +237,22 @@ func (s *testSyncerSuite) TestSampleUnhandledEvents(c *check.C) { syncer.recordUnhandledEvent("unhandled event from transaction payload", &replication.QueryEvent{}) entries := logs.All() - c.Assert(entries, check.HasLen, 2) + s.Require().Len(entries, 2) seen := make(map[string][]map[string]interface{}, len(entries)) for _, entry := range entries { seen[entry.Message] = append(seen[entry.Message], entry.ContextMap()) } - c.Assert(seen["unhandled event"], check.HasLen, 1) - c.Assert(seen["unhandled event"][0]["type"], check.Equals, "*replication.RowsQueryEvent") - c.Assert(seen["unhandled event from transaction payload"], check.HasLen, 1) - c.Assert(seen["unhandled event from transaction payload"][0]["type"], check.Equals, "*replication.QueryEvent") + s.Require().Len(seen["unhandled event"], 1) + s.Require().Equal("*replication.RowsQueryEvent", seen["unhandled event"][0]["type"]) + s.Require().Len(seen["unhandled event from transaction payload"], 1) + s.Require().Equal("*replication.QueryEvent", seen["unhandled event from transaction payload"][0]["type"]) syncer.recordUnhandledEvent("unhandled event", &replication.RowsQueryEvent{}) syncer.recordUnhandledEvent("unhandled event", &replication.QueryEvent{}) syncer.recordUnhandledEvent("unhandled event from transaction payload", &replication.QueryEvent{}) - c.Assert(logs.All(), check.HasLen, 2) + s.Require().Len(logs.All(), 2) } func mockGetServerUnixTS(mock sqlmock.Sqlmock) { @@ -259,7 +261,7 @@ func mockGetServerUnixTS(mock sqlmock.Sqlmock) { mock.ExpectQuery("SELECT UNIX_TIMESTAMP()").WillReturnRows(rows) } -func (s *testSyncerSuite) TestSelectDB(c *check.C) { +func (s *testSyncerSuite) TestSelectDB() { s.cfg.BAList = &filter.Rules{ DoDBs: []string{"~^b.*", "s1", "stest"}, } @@ -287,12 +289,12 @@ func (s *testSyncerSuite) TestSelectDB(c *check.C) { p := parser.New() cfg, err := s.cfg.Clone() - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer := NewSyncer(cfg, nil, nil) syncer.baList, err = filter.New(syncer.cfg.CaseSensitive, syncer.cfg.BAList) - c.Assert(err, check.IsNil) + s.Require().NoError(err) err = syncer.genRouter() - c.Assert(err, check.IsNil) + s.Require().NoError(err) header := &replication.EventHeader{ Timestamp: uint32(time.Now().Unix()), @@ -304,10 +306,10 @@ func (s *testSyncerSuite) TestSelectDB(c *check.C) { ddlWorker := NewDDLWorker(&syncer.tctx.Logger, syncer) for _, cs := range cases { e, err := event.GenQueryEvent(header, 123, 0, 0, 0, statusVars, cs.schema, cs.query) - c.Assert(err, check.IsNil) - c.Assert(e, check.NotNil) + s.Require().NoError(err) + s.Require().NotNil(e) ev, ok := e.Event.(*replication.QueryEvent) - c.Assert(ok, check.IsTrue) + s.Require().True(ok) sql := string(ev.Query) schema := string(ev.Schema) @@ -317,16 +319,16 @@ func (s *testSyncerSuite) TestSelectDB(c *check.C) { eventStatusVars: ev.StatusVars, } ddlInfo, err := ddlWorker.genDDLInfo(qec, sql) - c.Assert(err, check.IsNil) + s.Require().NoError(err) qec.originSQL = sql needSkip, err := syncer.skipQueryEvent(qec, ddlInfo) - c.Assert(err, check.IsNil) - c.Assert(needSkip, check.Equals, cs.skip) + s.Require().NoError(err) + s.Require().Equal(cs.skip, needSkip) } } -func (s *testSyncerSuite) TestSelectTable(c *check.C) { +func (s *testSyncerSuite) TestSelectTable() { s.cfg.BAList = &filter.Rules{ DoDBs: []string{"t2", "stest", "~^ptest*"}, DoTables: []*filter.Table{ @@ -335,7 +337,7 @@ func (s *testSyncerSuite) TestSelectTable(c *check.C) { {Schema: "~^ptest*", Name: "~^t.*"}, }, } - s.resetEventsGenerator(c) + s.resetEventsGenerator() events := mockBinlogEvents{ mockBinlogEvent{typ: DBCreate, args: []interface{}{"s1"}}, mockBinlogEvent{typ: TableCreate, args: []interface{}{"s1", "create table s1.log(id int)"}}, @@ -366,7 +368,7 @@ func (s *testSyncerSuite) TestSelectTable(c *check.C) { mockBinlogEvent{typ: DBDrop, args: []interface{}{"ptest1"}}, } - allEvents := s.generateEvents(events, c) + allEvents := s.generateEvents(events) res := [][]bool{ {true}, @@ -400,22 +402,22 @@ func (s *testSyncerSuite) TestSelectTable(c *check.C) { p := parser.New() cfg, err := s.cfg.Clone() - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer := NewSyncer(cfg, nil, nil) syncer.baList, err = filter.New(syncer.cfg.CaseSensitive, syncer.cfg.BAList) syncer.metricsProxies = metrics.DefaultMetricsProxies.CacheForOneTask("task", "worker", "source") - c.Assert(err, check.IsNil) - c.Assert(syncer.genRouter(), check.IsNil) + s.Require().NoError(err) + s.Require().Nil(syncer.genRouter()) - checkEventWithTableResult(c, syncer, allEvents, p, res) + checkEventWithTableResult(s.T(), syncer, allEvents, p, res) } -func (s *testSyncerSuite) TestIgnoreDB(c *check.C) { +func (s *testSyncerSuite) TestIgnoreDB() { s.cfg.BAList = &filter.Rules{ IgnoreDBs: []string{"~^b.*", "s1", "stest"}, } - s.resetEventsGenerator(c) + s.resetEventsGenerator() events := mockBinlogEvents{ mockBinlogEvent{typ: DBCreate, args: []interface{}{"s1"}}, mockBinlogEvent{typ: DBDrop, args: []interface{}{"s1"}}, @@ -431,17 +433,17 @@ func (s *testSyncerSuite) TestIgnoreDB(c *check.C) { mockBinlogEvent{typ: DBDrop, args: []interface{}{"st"}}, } - allEvents := s.generateEvents(events, c) + allEvents := s.generateEvents(events) res := []bool{true, true, false, false, true, true, true, true, true, true, false, false} p := parser.New() cfg, err := s.cfg.Clone() - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer := NewSyncer(cfg, nil, nil) syncer.baList, err = filter.New(syncer.cfg.CaseSensitive, syncer.cfg.BAList) - c.Assert(err, check.IsNil) - c.Assert(syncer.genRouter(), check.IsNil) + s.Require().NoError(err) + s.Require().Nil(syncer.genRouter()) i := 0 ddlWorker := NewDDLWorker(&syncer.tctx.Logger, syncer) @@ -459,17 +461,17 @@ func (s *testSyncerSuite) TestIgnoreDB(c *check.C) { eventStatusVars: statusVars, } ddlInfo, err := ddlWorker.genDDLInfo(qec, sql) - c.Assert(err, check.IsNil) + s.Require().NoError(err) qec.originSQL = sql needSkip, err := syncer.skipQueryEvent(qec, ddlInfo) - c.Assert(err, check.IsNil) - c.Assert(needSkip, check.Equals, res[i]) + s.Require().NoError(err) + s.Require().Equal(res[i], needSkip) i++ } } -func (s *testSyncerSuite) TestIgnoreTable(c *check.C) { +func (s *testSyncerSuite) TestIgnoreTable() { s.cfg.BAList = &filter.Rules{ IgnoreDBs: []string{"t2"}, IgnoreTables: []*filter.Table{ @@ -478,7 +480,7 @@ func (s *testSyncerSuite) TestIgnoreTable(c *check.C) { }, } - s.resetEventsGenerator(c) + s.resetEventsGenerator() events := mockBinlogEvents{ mockBinlogEvent{typ: DBCreate, args: []interface{}{"s1"}}, mockBinlogEvent{typ: TableCreate, args: []interface{}{"s1", "create table s1.log(id int)"}}, @@ -506,7 +508,7 @@ func (s *testSyncerSuite) TestIgnoreTable(c *check.C) { mockBinlogEvent{typ: TableDrop, args: []interface{}{"t2", "log"}}, mockBinlogEvent{typ: DBDrop, args: []interface{}{"t2"}}, } - allEvents := s.generateEvents(events, c) + allEvents := s.generateEvents(events) res := [][]bool{ {false}, @@ -538,17 +540,17 @@ func (s *testSyncerSuite) TestIgnoreTable(c *check.C) { p := parser.New() cfg, err := s.cfg.Clone() - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer := NewSyncer(cfg, nil, nil) syncer.baList, err = filter.New(syncer.cfg.CaseSensitive, syncer.cfg.BAList) syncer.metricsProxies = metrics.DefaultMetricsProxies.CacheForOneTask("task", "worker", "source") - c.Assert(err, check.IsNil) - c.Assert(syncer.genRouter(), check.IsNil) + s.Require().NoError(err) + s.Require().Nil(syncer.genRouter()) - checkEventWithTableResult(c, syncer, allEvents, p, res) + checkEventWithTableResult(s.T(), syncer, allEvents, p, res) } -func (s *testSyncerSuite) TestSkipDML(c *check.C) { +func (s *testSyncerSuite) TestSkipDML() { s.cfg.FilterRules = []*bf.BinlogEventRule{ { SchemaPattern: "*", @@ -574,7 +576,7 @@ func (s *testSyncerSuite) TestSkipDML(c *check.C) { } s.cfg.BAList = nil - s.resetEventsGenerator(c) + s.resetEventsGenerator() type SQLChecker struct { events []*replication.BinlogEvent @@ -584,61 +586,61 @@ func (s *testSyncerSuite) TestSkipDML(c *check.C) { sqls := make([]SQLChecker, 0, 16) - evs := s.generateEvents([]mockBinlogEvent{{DBCreate, []interface{}{"foo"}}}, c) + evs := s.generateEvents([]mockBinlogEvent{{DBCreate, []interface{}{"foo"}}}) sqls = append(sqls, SQLChecker{events: evs, isDML: false, expected: false}) - evs = s.generateEvents([]mockBinlogEvent{{TableCreate, []interface{}{"foo", "create table foo.bar(id int)"}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{TableCreate, []interface{}{"foo", "create table foo.bar(id int)"}}}) sqls = append(sqls, SQLChecker{events: evs, isDML: false, expected: false}) - evs = s.generateEvents([]mockBinlogEvent{{Write, []interface{}{uint64(8), "foo", "bar", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(1)}}}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{Write, []interface{}{uint64(8), "foo", "bar", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(1)}}}}}) sqls = append(sqls, SQLChecker{events: evs, isDML: true, expected: false}) - evs = s.generateEvents([]mockBinlogEvent{{Update, []interface{}{uint64(8), "foo", "bar", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(2)}, {int32(1)}}}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{Update, []interface{}{uint64(8), "foo", "bar", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(2)}, {int32(1)}}}}}) sqls = append(sqls, SQLChecker{events: evs, isDML: true, expected: true}) - evs = s.generateEvents([]mockBinlogEvent{{Delete, []interface{}{uint64(8), "foo", "bar", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(2)}}}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{Delete, []interface{}{uint64(8), "foo", "bar", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(2)}}}}}) sqls = append(sqls, SQLChecker{events: evs, isDML: true, expected: true}) - evs = s.generateEvents([]mockBinlogEvent{{DBDrop, []interface{}{"foo1"}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{DBDrop, []interface{}{"foo1"}}}) sqls = append(sqls, SQLChecker{events: evs, isDML: false, expected: false}) - evs = s.generateEvents([]mockBinlogEvent{{DBCreate, []interface{}{"foo1"}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{DBCreate, []interface{}{"foo1"}}}) sqls = append(sqls, SQLChecker{events: evs, isDML: false, expected: false}) - evs = s.generateEvents([]mockBinlogEvent{{TableCreate, []interface{}{"foo1", "create table foo1.bar1(id int)"}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{TableCreate, []interface{}{"foo1", "create table foo1.bar1(id int)"}}}) sqls = append(sqls, SQLChecker{events: evs, isDML: false, expected: false}) - evs = s.generateEvents([]mockBinlogEvent{{Write, []interface{}{uint64(9), "foo1", "bar1", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(1)}}}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{Write, []interface{}{uint64(9), "foo1", "bar1", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(1)}}}}}) sqls = append(sqls, SQLChecker{events: evs, isDML: true, expected: false}) - evs = s.generateEvents([]mockBinlogEvent{{Update, []interface{}{uint64(9), "foo1", "bar1", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(2)}, {int32(1)}}}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{Update, []interface{}{uint64(9), "foo1", "bar1", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(2)}, {int32(1)}}}}}) sqls = append(sqls, SQLChecker{events: evs, isDML: true, expected: true}) - evs = s.generateEvents([]mockBinlogEvent{{Delete, []interface{}{uint64(9), "foo1", "bar1", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(2)}}}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{Delete, []interface{}{uint64(9), "foo1", "bar1", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(2)}}}}}) sqls = append(sqls, SQLChecker{events: evs, isDML: true, expected: true}) - evs = s.generateEvents([]mockBinlogEvent{{TableCreate, []interface{}{"foo1", "create table foo1.bar2(id int)"}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{TableCreate, []interface{}{"foo1", "create table foo1.bar2(id int)"}}}) sqls = append(sqls, SQLChecker{events: evs, isDML: false, expected: false}) - evs = s.generateEvents([]mockBinlogEvent{{Write, []interface{}{uint64(10), "foo1", "bar2", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(1)}}}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{Write, []interface{}{uint64(10), "foo1", "bar2", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(1)}}}}}) sqls = append(sqls, SQLChecker{events: evs, isDML: true, expected: false}) - evs = s.generateEvents([]mockBinlogEvent{{Update, []interface{}{uint64(10), "foo1", "bar2", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(2)}, {int32(1)}}}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{Update, []interface{}{uint64(10), "foo1", "bar2", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(2)}, {int32(1)}}}}}) sqls = append(sqls, SQLChecker{events: evs, isDML: true, expected: true}) - evs = s.generateEvents([]mockBinlogEvent{{Delete, []interface{}{uint64(10), "foo1", "bar2", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(2)}}}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{Delete, []interface{}{uint64(10), "foo1", "bar2", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(2)}}}}}) sqls = append(sqls, SQLChecker{events: evs, isDML: true, expected: true}) p := parser.New() var err error cfg, err := s.cfg.Clone() - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer := NewSyncer(cfg, nil, nil) - c.Assert(syncer.genRouter(), check.IsNil) + s.Require().Nil(syncer.genRouter()) syncer.binlogFilter, err = bf.NewBinlogEvent(false, s.cfg.FilterRules) - c.Assert(err, check.IsNil) + s.Require().NoError(err) for _, sql := range sqls { events := sql.events @@ -646,15 +648,15 @@ func (s *testSyncerSuite) TestSkipDML(c *check.C) { switch ev := e.Event.(type) { case *replication.QueryEvent: _, err = p.ParseOneStmt(string(ev.Query), "", "") - c.Assert(err, check.IsNil) + s.Require().NoError(err) case *replication.RowsEvent: table := &filter.Table{ Schema: string(ev.Table.Schema), Name: string(ev.Table.Table), } needSkip, err := syncer.skipRowsEvent(table, e.Header.EventType) - c.Assert(err, check.IsNil) - c.Assert(needSkip, check.Equals, sql.expected) + s.Require().NoError(err) + s.Require().Equal(sql.expected, needSkip) default: continue } @@ -662,7 +664,7 @@ func (s *testSyncerSuite) TestSkipDML(c *check.C) { } } -func (s *testSyncerSuite) TestColumnMapping(c *check.C) { +func (s *testSyncerSuite) TestColumnMapping() { rules := []*cm.Rule{ { PatternSchema: "stest*", @@ -680,7 +682,7 @@ func (s *testSyncerSuite) TestColumnMapping(c *check.C) { }, } - s.resetEventsGenerator(c) + s.resetEventsGenerator() // create db and tables events := mockBinlogEvents{ @@ -690,7 +692,7 @@ func (s *testSyncerSuite) TestColumnMapping(c *check.C) { mockBinlogEvent{typ: TableCreate, args: []interface{}{"stest_3", "create table stest_3.a(id int)"}}, } - createEvents := s.generateEvents(events, c) + createEvents := s.generateEvents(events) // dmls type dml struct { @@ -701,13 +703,13 @@ func (s *testSyncerSuite) TestColumnMapping(c *check.C) { dmls := make([]dml, 0, 3) - evs := s.generateEvents([]mockBinlogEvent{{typ: Write, args: []interface{}{uint64(8), "stest_3", "t_2", []byte{mysql.MYSQL_TYPE_STRING, mysql.MYSQL_TYPE_LONG}, [][]interface{}{{"ian", int32(10)}}}}}, c) + evs := s.generateEvents([]mockBinlogEvent{{typ: Write, args: []interface{}{uint64(8), "stest_3", "t_2", []byte{mysql.MYSQL_TYPE_STRING, mysql.MYSQL_TYPE_LONG}, [][]interface{}{{"ian", int32(10)}}}}}) dmls = append(dmls, dml{events: evs, column: []string{"name", "id"}, data: []interface{}{"ian", int64(1<<59 | 3<<52 | 2<<44 | 10)}}) - evs = s.generateEvents([]mockBinlogEvent{{typ: Write, args: []interface{}{uint64(9), "stest_3", "log", []byte{mysql.MYSQL_TYPE_STRING}, [][]interface{}{{"10"}}}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{typ: Write, args: []interface{}{uint64(9), "stest_3", "log", []byte{mysql.MYSQL_TYPE_STRING}, [][]interface{}{{"10"}}}}}) dmls = append(dmls, dml{events: evs, column: []string{"id"}, data: []interface{}{"test:10"}}) - evs = s.generateEvents([]mockBinlogEvent{{typ: Write, args: []interface{}{uint64(10), "stest_3", "a", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(10)}}}}}, c) + evs = s.generateEvents([]mockBinlogEvent{{typ: Write, args: []interface{}{uint64(10), "stest_3", "a", []byte{mysql.MYSQL_TYPE_LONG}, [][]interface{}{{int32(10)}}}}}) dmls = append(dmls, dml{events: evs, column: []string{"id"}, data: []interface{}{int32(10)}}) dmlEvents := make([]*replication.BinlogEvent, 0, 15) @@ -723,12 +725,12 @@ func (s *testSyncerSuite) TestColumnMapping(c *check.C) { mockBinlogEvent{typ: TableDrop, args: []interface{}{"stest_3", "a"}}, mockBinlogEvent{typ: DBDrop, args: []interface{}{"stest_3"}}, } - dropEvents := s.generateEvents(events, c) + dropEvents := s.generateEvents(events) p := parser.New() var err error mapping, err := cm.NewMapping(false, rules) - c.Assert(err, check.IsNil) + s.Require().NoError(err) allEvents := createEvents allEvents = append(allEvents, dmlEvents...) @@ -738,11 +740,11 @@ func (s *testSyncerSuite) TestColumnMapping(c *check.C) { switch ev := e.Event.(type) { case *replication.QueryEvent: _, err = p.ParseOneStmt(string(ev.Query), "", "") - c.Assert(err, check.IsNil) + s.Require().NoError(err) case *replication.RowsEvent: r, _, err := mapping.HandleRowValue(string(ev.Table.Schema), string(ev.Table.Table), dmls[dmlIndex].column, ev.Rows[0]) - c.Assert(err, check.IsNil) - c.Assert(r, check.DeepEquals, dmls[dmlIndex].data) + s.Require().NoError(err) + s.Require().Equal(dmls[dmlIndex].data, r) dmlIndex++ default: continue @@ -750,31 +752,31 @@ func (s *testSyncerSuite) TestColumnMapping(c *check.C) { } } -func (s *testSyncerSuite) TestcheckpointID(c *check.C) { +func (s *testSyncerSuite) TestcheckpointID() { cfg, err := s.cfg.Clone() - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer := NewSyncer(cfg, nil, nil) checkpointID := syncer.checkpointID() - c.Assert(checkpointID, check.Equals, "101") + s.Require().Equal("101", checkpointID) } // TODO: add `TestSharding` later. -func (s *testSyncerSuite) TestRun(c *check.C) { +func (s *testSyncerSuite) TestRun() { // 1. execute some sqls which will trigger causality // 2. check the generated jobs // 3. update config, add route rules, and update syncer // 4. execute some sqls and then check jobs generated db, mock, err := sqlmock.New() - c.Assert(err, check.IsNil) + s.Require().NoError(err) mockGetServerUnixTS(mock) dbConn, err := db.Conn(context.Background()) - c.Assert(err, check.IsNil) + s.Require().NoError(err) checkPointDB, checkPointMock, err := sqlmock.New() - c.Assert(err, check.IsNil) + s.Require().NoError(err) checkPointDBConn, err := checkPointDB.Conn(context.Background()) - c.Assert(err, check.IsNil) + s.Require().NoError(err) testJobs.jobs = testJobs.jobs[:0] @@ -795,7 +797,7 @@ func (s *testSyncerSuite) TestRun(c *check.C) { } cfg, err := s.cfg.Clone() - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer := NewSyncer(cfg, nil, nil) syncer.cfg.CheckpointFlushInterval = 30 // defaultCheckpointFlushInterval syncer.cfg.SafeModeDuration = "60s" // defaultCheckpointFlushInterval * 2 @@ -807,7 +809,7 @@ func (s *testSyncerSuite) TestRun(c *check.C) { syncer.ddlDBConn = dbconn.NewDBConn(s.cfg, conn.NewBaseConnForTest(dbConn, &retry.FiniteRetryStrategy{})) syncer.downstreamTrackConn = dbconn.NewDBConn(s.cfg, conn.NewBaseConnForTest(dbConn, &retry.FiniteRetryStrategy{})) syncer.schemaTracker, err = schema.NewTestTracker(context.Background(), s.cfg.Name, syncer.downstreamTrackConn, log.L()) - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer.metricsProxies = metrics.DefaultMetricsProxies.CacheForOneTask("task", "worker", "source") @@ -822,13 +824,13 @@ func (s *testSyncerSuite) TestRun(c *check.C) { AddRow("t_1", "create table t_1(id int primary key, name varchar(24), KEY `index1` (`name`))")) syncer.exprFilterGroup = NewExprFilterGroup(tcontext.Background(), utils.NewSessionCtx(nil), nil) - c.Assert(syncer.Type(), check.Equals, pb.UnitType_Sync) + s.Require().Equal(pb.UnitType_Sync, syncer.Type()) - c.Assert(syncer.genRouter(), check.IsNil) + s.Require().Nil(syncer.genRouter()) syncer.metricsProxies = metrics.DefaultMetricsProxies.CacheForOneTask("task", "worker", "source") - syncer.setupMockCheckpoint(c, checkPointDBConn, checkPointMock) + syncer.setupMockCheckpoint(s.T(), checkPointDBConn, checkPointMock) syncer.reset() events1 := mockBinlogEvents{ @@ -847,9 +849,9 @@ func (s *testSyncerSuite) TestRun(c *check.C) { mockBinlogEvent{typ: DDL, args: []interface{}{"test_1", "alter table test_1.t_3 add primary key(id, name)"}}, } - mockStreamerProducer := &MockStreamProducer{s.generateEvents(events1, c)} + mockStreamerProducer := &MockStreamProducer{s.generateEvents(events1)} mockStreamer, err := mockStreamerProducer.GenerateStreamFrom(binlog.MustZeroLocation(mysql.MySQLFlavor)) - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer.streamerController = binlogstream.NewStreamerController4Test( mockStreamerProducer, mockStreamer, @@ -953,11 +955,11 @@ func (s *testSyncerSuite) TestRun(c *check.C) { } executeSQLAndWait(len(expectJobs1)) - c.Assert(syncer.Status(nil).(*pb.SyncStatus).TotalEvents, check.Equals, int64(0)) + s.Require().Equal(int64(0), syncer.Status(nil).(*pb.SyncStatus).TotalEvents) syncer.mockFinishJob(expectJobs1) testJobs.Lock() - checkJobs(c, testJobs.jobs, expectJobs1) + checkJobs(s.T(), testJobs.jobs, expectJobs1) testJobs.jobs = testJobs.jobs[:0] testJobs.Unlock() @@ -976,7 +978,7 @@ func (s *testSyncerSuite) TestRun(c *check.C) { // when syncer exit Run(), will flush job syncer.Pause() - mockDBProvider := conn.InitMockDB(c) + mockDBProvider := conn.InitMockDB(s.T()) mockDBProvider.ExpectQuery("SELECT cast\\(TIMEDIFF\\(NOW\\(6\\), UTC_TIMESTAMP\\(6\\)\\) as time\\);"). WillReturnRows(sqlmock.NewRows([]string{""}).AddRow("01:00:00")) mockGetServerUnixTS(mock) @@ -987,8 +989,8 @@ func (s *testSyncerSuite) TestRun(c *check.C) { sqlmock.NewRows([]string{"Table", "Create Table"}). AddRow("t_2", "create table t_2(id int primary key, name varchar(24))")) - c.Assert(syncer.Update(context.Background(), s.cfg), check.IsNil) - c.Assert(syncer.timezone.String(), check.Equals, "+01:00") + s.Require().Nil(syncer.Update(context.Background(), s.cfg)) + s.Require().Equal("+01:00", syncer.timezone.String()) events2 := mockBinlogEvents{ mockBinlogEvent{typ: Write, args: []interface{}{uint64(8), "test_1", "t_1", []byte{mysql.MYSQL_TYPE_LONG, mysql.MYSQL_TYPE_STRING}, [][]interface{}{{int32(3), "c"}}}}, @@ -1001,11 +1003,11 @@ func (s *testSyncerSuite) TestRun(c *check.C) { syncer.secondsBehindMaster.Store(100) syncer.workerJobTSArray[ddlJobIdx].Store(100) syncer.reset() - c.Assert(syncer.secondsBehindMaster.Load(), check.Equals, int64(0)) - c.Assert(syncer.workerJobTSArray[ddlJobIdx].Load(), check.Equals, int64(0)) - mockStreamerProducer = &MockStreamProducer{s.generateEvents(events2, c)} + s.Require().Equal(int64(0), syncer.secondsBehindMaster.Load()) + s.Require().Equal(int64(0), syncer.workerJobTSArray[ddlJobIdx].Load()) + mockStreamerProducer = &MockStreamProducer{s.generateEvents(events2)} mockStreamer, err = mockStreamerProducer.GenerateStreamFrom(binlog.MustZeroLocation(mysql.MySQLFlavor)) - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer.streamerController = binlogstream.NewStreamerController4Test( mockStreamerProducer, mockStreamer, @@ -1042,12 +1044,12 @@ func (s *testSyncerSuite) TestRun(c *check.C) { } executeSQLAndWait(len(expectJobs2)) - c.Assert(syncer.Status(nil).(*pb.SyncStatus).TotalEvents, check.Equals, int64(len(expectJobs1))) + s.Require().Equal(int64(len(expectJobs1)), syncer.Status(nil).(*pb.SyncStatus).TotalEvents) syncer.mockFinishJob(expectJobs2) - c.Assert(syncer.Status(nil).(*pb.SyncStatus).TotalEvents, check.Equals, int64(len(expectJobs1)+len(expectJobs2))) + s.Require().Equal(int64(len(expectJobs1)+len(expectJobs2)), syncer.Status(nil).(*pb.SyncStatus).TotalEvents) testJobs.RLock() - checkJobs(c, testJobs.jobs, expectJobs2) + checkJobs(s.T(), testJobs.jobs, expectJobs2) testJobs.RUnlock() cancel() @@ -1058,15 +1060,15 @@ func (s *testSyncerSuite) TestRun(c *check.C) { syncer.sessCtx = utils.NewSessionCtx(map[string]string{"time_zone": "UTC"}) sourceSchemaFromCheckPoint, err := syncer.OperateSchema(ctx, &pb.OperateWorkerSchemaRequest{Op: pb.SchemaOp_GetSchema, Database: "test_1", Table: "t_1"}) - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer.tableRouter = ®exprrouter.RouteTable{} - c.Assert(syncer.tableRouter.AddRule(&router.TableRule{ + s.Require().NoError(syncer.tableRouter.AddRule(&router.TableRule{ SchemaPattern: "test_1", TablePattern: "t_1", TargetSchema: "test_1", TargetTable: "t_2", - }), check.IsNil) + })) syncer.checkpoint.(*RemoteCheckPoint).points = make(map[string]map[string]*binlogPoint) @@ -1082,7 +1084,7 @@ func (s *testSyncerSuite) TestRun(c *check.C) { AddRow("t_2", showTableResultString)) sourceSchemaFromDownstream, err := syncer.OperateSchema(ctx, &pb.OperateWorkerSchemaRequest{Op: pb.SchemaOp_GetSchema, Database: "test_1", Table: "t_1"}) - c.Assert(err, check.IsNil) + s.Require().NoError(err) sourceSchemaExpected := "CREATE TABLE `t_1` (" + " `id` int(11) NOT NULL," + @@ -1090,35 +1092,35 @@ func (s *testSyncerSuite) TestRun(c *check.C) { " PRIMARY KEY (`id`) /*T![clustered_index] NONCLUSTERED */," + " KEY `index1` (`name`)" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin" - c.Assert(sourceSchemaFromCheckPoint, check.Equals, sourceSchemaExpected) - c.Assert(sourceSchemaFromDownstream, check.Equals, sourceSchemaExpected) + s.Require().Equal(sourceSchemaExpected, sourceSchemaFromCheckPoint) + s.Require().Equal(sourceSchemaExpected, sourceSchemaFromDownstream) cancel() // test OperateSchema ends syncer.Close() - c.Assert(syncer.isClosed(), check.IsTrue) + s.Require().True(syncer.isClosed()) if err := mock.ExpectationsWereMet(); err != nil { - c.Errorf("db unfulfilled expectations: %s", err) + s.T().Errorf("db unfulfilled expectations: %s", err) } if err := checkPointMock.ExpectationsWereMet(); err != nil { - c.Errorf("checkpointDB unfulfilled expectations: %s", err) + s.T().Errorf("checkpointDB unfulfilled expectations: %s", err) } } -func (s *testSyncerSuite) TestExitSafeModeByConfig(c *check.C) { +func (s *testSyncerSuite) TestExitSafeModeByConfig() { db, mock, err := sqlmock.New() - c.Assert(err, check.IsNil) + s.Require().NoError(err) mockGetServerUnixTS(mock) dbConn, err := db.Conn(context.Background()) - c.Assert(err, check.IsNil) + s.Require().NoError(err) checkPointDB, checkPointMock, err := sqlmock.New() - c.Assert(err, check.IsNil) + s.Require().NoError(err) checkPointDBConn, err := checkPointDB.Conn(context.Background()) - c.Assert(err, check.IsNil) + s.Require().NoError(err) testJobs.jobs = testJobs.jobs[:0] @@ -1134,7 +1136,7 @@ func (s *testSyncerSuite) TestExitSafeModeByConfig(c *check.C) { } cfg, err := s.cfg.Clone() - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer := NewSyncer(cfg, nil, nil) syncer.fromDB = &dbconn.UpStreamConn{BaseDB: conn.NewBaseDBForTest(db)} syncer.toDBConns = []*dbconn.DBConn{ @@ -1152,15 +1154,15 @@ func (s *testSyncerSuite) TestExitSafeModeByConfig(c *check.C) { AddRow("t_1", "create table t_1(id int primary key, name varchar(24))")) syncer.schemaTracker, err = schema.NewTestTracker(context.Background(), s.cfg.Name, syncer.ddlDBConn, log.L()) - c.Assert(err, check.IsNil) - c.Assert(syncer.Type(), check.Equals, pb.UnitType_Sync) + s.Require().NoError(err) + s.Require().Equal(pb.UnitType_Sync, syncer.Type()) syncer.exprFilterGroup = NewExprFilterGroup(tcontext.Background(), utils.NewSessionCtx(nil), nil) - c.Assert(syncer.genRouter(), check.IsNil) + s.Require().Nil(syncer.genRouter()) syncer.metricsProxies = metrics.DefaultMetricsProxies.CacheForOneTask("task", "worker", "source") - syncer.setupMockCheckpoint(c, checkPointDBConn, checkPointMock) + syncer.setupMockCheckpoint(s.T(), checkPointDBConn, checkPointMock) syncer.reset() @@ -1173,9 +1175,9 @@ func (s *testSyncerSuite) TestExitSafeModeByConfig(c *check.C) { mockBinlogEvent{typ: Update, args: []interface{}{uint64(8), "test_1", "t_1", []byte{mysql.MYSQL_TYPE_LONG, mysql.MYSQL_TYPE_STRING}, [][]interface{}{{int32(2), "b"}, {int32(1), "b"}}}}, } - generatedEvents1 := s.generateEvents(events1, c) + generatedEvents1 := s.generateEvents(events1) // make sure [18] is last event, and use [18]'s position as safeModeExitLocation - c.Assert(len(generatedEvents1), check.Equals, 19) + s.Require().Equal(19, len(generatedEvents1)) safeModeExitLocation := binlog.MustZeroLocation(mysql.MySQLFlavor) safeModeExitLocation.Position.Pos = generatedEvents1[18].Header.LogPos syncer.checkpoint.SaveSafeModeExitPoint(&safeModeExitLocation) @@ -1186,14 +1188,14 @@ func (s *testSyncerSuite) TestExitSafeModeByConfig(c *check.C) { mockBinlogEvent{typ: Delete, args: []interface{}{uint64(8), "test_1", "t_1", []byte{mysql.MYSQL_TYPE_LONG, mysql.MYSQL_TYPE_STRING}, [][]interface{}{{int32(1), "a"}}}}, mockBinlogEvent{typ: Update, args: []interface{}{uint64(8), "test_1", "t_1", []byte{mysql.MYSQL_TYPE_LONG, mysql.MYSQL_TYPE_STRING}, [][]interface{}{{int32(2), "b"}, {int32(1), "b"}}}}, } - generatedEvents2 := s.generateEvents(events2, c) + generatedEvents2 := s.generateEvents(events2) generatedEvents := generatedEvents1 generatedEvents = append(generatedEvents, generatedEvents2...) mockStreamerProducer := &MockStreamProducer{generatedEvents} mockStreamer, err := mockStreamerProducer.GenerateStreamFrom(binlog.MustZeroLocation(mysql.MySQLFlavor)) - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer.streamerController = binlogstream.NewStreamerController4Test( mockStreamerProducer, mockStreamer, @@ -1217,12 +1219,12 @@ func (s *testSyncerSuite) TestExitSafeModeByConfig(c *check.C) { checkPointMock.ExpectExec(".*INSERT INTO .* VALUES.* ON DUPLICATE KEY UPDATE.*").WillReturnResult(sqlmock.NewResult(0, 1)) checkPointMock.ExpectCommit() // disable 1-minute safe mode - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/syncer/SafeModeInitPhaseSeconds", `return("10ms")`), check.IsNil) + s.Require().Nil(failpoint.Enable("github.com/pingcap/tiflow/dm/syncer/SafeModeInitPhaseSeconds", `return("10ms")`)) go syncer.Process(ctx, resultCh) go func() { for r := range resultCh { if len(r.Errors) > 0 { - c.Fatal(r.String()) + s.T().Fatal(r.String()) } } }() @@ -1278,55 +1280,55 @@ func (s *testSyncerSuite) TestExitSafeModeByConfig(c *check.C) { } executeSQLAndWait(len(expectJobs)) - c.Assert(syncer.Status(nil).(*pb.SyncStatus).TotalEvents, check.Equals, int64(0)) + s.Require().Equal(int64(0), syncer.Status(nil).(*pb.SyncStatus).TotalEvents) syncer.mockFinishJob(expectJobs) testJobs.Lock() - checkJobs(c, testJobs.jobs, expectJobs) + checkJobs(s.T(), testJobs.jobs, expectJobs) testJobs.jobs = testJobs.jobs[:0] testJobs.Unlock() cancel() syncer.Close() - c.Assert(syncer.isClosed(), check.IsTrue) + s.Require().True(syncer.isClosed()) if err := mock.ExpectationsWereMet(); err != nil { - c.Errorf("db unfulfilled expectations: %s", err) + s.T().Errorf("db unfulfilled expectations: %s", err) } if err := checkPointMock.ExpectationsWereMet(); err != nil { - c.Errorf("checkpointDB unfulfilled expectations: %s", err) + s.T().Errorf("checkpointDB unfulfilled expectations: %s", err) } - c.Assert(failpoint.Disable("github.com/pingcap/tiflow/dm/syncer/SafeModeInitPhaseSeconds"), check.IsNil) + s.Require().Nil(failpoint.Disable("github.com/pingcap/tiflow/dm/syncer/SafeModeInitPhaseSeconds")) } -func (s *testSyncerSuite) TestRemoveMetadataIsFine(c *check.C) { +func (s *testSyncerSuite) TestRemoveMetadataIsFine() { cfg, err := s.cfg.Clone() - c.Assert(err, check.IsNil) + s.Require().NoError(err) cfg.Mode = config.ModeAll syncer := NewSyncer(cfg, nil, nil) fresh, err := syncer.IsFreshTask(context.Background()) - c.Assert(err, check.IsNil) - c.Assert(fresh, check.IsTrue) + s.Require().NoError(err) + s.Require().True(fresh) filename := filepath.Join(s.cfg.Dir, "metadata") err = os.WriteFile(filename, []byte("SHOW MASTER STATUS:\n\tLog: BAD METADATA"), 0o644) - c.Assert(err, check.IsNil) - c.Assert(syncer.checkpoint.LoadMeta(context.Background()), check.NotNil) + s.Require().NoError(err) + s.Require().Error(syncer.checkpoint.LoadMeta(context.Background())) err = os.WriteFile(filename, []byte("SHOW MASTER STATUS:\n\tLog: mysql-bin.000003\n\tPos: 1234\n\tGTID:\n\n"), 0o644) - c.Assert(err, check.IsNil) - c.Assert(syncer.checkpoint.LoadMeta(context.Background()), check.IsNil) + s.Require().NoError(err) + s.Require().Nil(syncer.checkpoint.LoadMeta(context.Background())) - c.Assert(os.Remove(filename), check.IsNil) + s.Require().Nil(os.Remove(filename)) // after successful LoadMeta, IsFreshTask should return false so don't load again fresh, err = syncer.IsFreshTask(context.Background()) - c.Assert(err, check.IsNil) - c.Assert(fresh, check.IsFalse) + s.Require().NoError(err) + s.Require().False(fresh) } -func (s *testSyncerSuite) TestTrackDDL(c *check.C) { +func (s *testSyncerSuite) TestTrackDDL() { var ( testDB = "test_db" testTbl = "test_tbl" @@ -1340,17 +1342,17 @@ func (s *testSyncerSuite) TestTrackDDL(c *check.C) { } ) db, mock, err := sqlmock.New() - c.Assert(err, check.IsNil) + s.Require().NoError(err) dbConn, err := db.Conn(context.Background()) - c.Assert(err, check.IsNil) + s.Require().NoError(err) checkPointDB, checkPointMock, err := sqlmock.New() - c.Assert(err, check.IsNil) + s.Require().NoError(err) checkPointDBConn, err := checkPointDB.Conn(context.Background()) - c.Assert(err, check.IsNil) + s.Require().NoError(err) cfg, err := s.cfg.Clone() - c.Assert(err, check.IsNil) + s.Require().NoError(err) syncer := NewSyncer(cfg, nil, nil) syncer.toDBConns = []*dbconn.DBConn{ dbconn.NewDBConn(s.cfg, conn.NewBaseConnForTest(dbConn, &retry.FiniteRetryStrategy{})), @@ -1359,10 +1361,10 @@ func (s *testSyncerSuite) TestTrackDDL(c *check.C) { syncer.ddlDBConn = dbconn.NewDBConn(s.cfg, conn.NewBaseConnForTest(dbConn, &retry.FiniteRetryStrategy{})) syncer.checkpoint.(*RemoteCheckPoint).dbConn = dbconn.NewDBConn(s.cfg, conn.NewBaseConnForTest(checkPointDBConn, &retry.FiniteRetryStrategy{})) syncer.schemaTracker, err = schema.NewTestTracker(context.Background(), s.cfg.Name, syncer.ddlDBConn, log.L()) - c.Assert(err, check.IsNil) + s.Require().NoError(err) defer syncer.schemaTracker.Close() syncer.exprFilterGroup = NewExprFilterGroup(tcontext.Background(), utils.NewSessionCtx(nil), nil) - c.Assert(syncer.genRouter(), check.IsNil) + s.Require().Nil(syncer.genRouter()) cases := []struct { sql string @@ -1441,19 +1443,19 @@ func (s *testSyncerSuite) TestTrackDDL(c *check.C) { ddlWorker := NewDDLWorker(&syncer.tctx.Logger, syncer) for _, ca := range cases { ddlInfo, err := ddlWorker.genDDLInfo(qec, ca.sql) - c.Assert(err, check.IsNil) + s.Require().NoError(err) ca.callback() syncer.foreignKeyRouteTopologyChecked = true - c.Assert(syncer.trackDDL(testDB, ddlInfo, ec), check.IsNil) - c.Assert(syncer.foreignKeyRouteTopologyChecked, check.Equals, false) + s.Require().Nil(syncer.trackDDL(testDB, ddlInfo, ec)) + s.Require().False(syncer.foreignKeyRouteTopologyChecked) syncer.schemaTracker.Reset() - c.Assert(mock.ExpectationsWereMet(), check.IsNil) - c.Assert(checkPointMock.ExpectationsWereMet(), check.IsNil) + s.Require().Nil(mock.ExpectationsWereMet()) + s.Require().Nil(checkPointMock.ExpectationsWereMet()) } } -func checkEventWithTableResult(c *check.C, syncer *Syncer, allEvents []*replication.BinlogEvent, p *parser.Parser, res [][]bool) { +func checkEventWithTableResult(t *testing.T, syncer *Syncer, allEvents []*replication.BinlogEvent, p *parser.Parser, res [][]bool) { i := 0 tctx := tcontext.Background().WithLogger(log.With(zap.String("test", "checkEventWithTableResult"))) ec := &eventContext{ @@ -1472,32 +1474,32 @@ func checkEventWithTableResult(c *check.C, syncer *Syncer, allEvents []*replicat eventStatusVars: statusVars, } stmt, err := parseOneStmt(qec) - c.Assert(err, check.IsNil) + require.NoError(t, err) if _, ok := stmt.(ast.DDLNode); !ok { continue // BEGIN event } qec.splitDDLs, err = parserpkg.SplitDDL(stmt, qec.ddlSchema) - c.Assert(err, check.IsNil) + require.NoError(t, err) for _, sql := range qec.splitDDLs { sqls, err := ddlWorker.processOneDDL(qec, sql) - c.Assert(err, check.IsNil) + require.NoError(t, err) qec.appliedDDLs = append(qec.appliedDDLs, sqls...) } if len(qec.appliedDDLs) == 0 { - c.Assert(res[i], check.HasLen, 1) - c.Assert(res[i][0], check.Equals, true) + require.Len(t, res[i], 1) + require.Equal(t, true, res[i][0]) i++ continue } for j, sql := range qec.appliedDDLs { ddlInfo, err := ddlWorker.genDDLInfo(qec, sql) - c.Assert(err, check.IsNil) + require.NoError(t, err) needSkip, err := syncer.skipQueryEvent(qec, ddlInfo) - c.Assert(err, check.IsNil) - c.Assert(needSkip, check.Equals, res[i][j]) + require.NoError(t, err) + require.Equal(t, res[i][j], needSkip) } case *replication.RowsEvent: table := &filter.Table{ @@ -1505,8 +1507,8 @@ func checkEventWithTableResult(c *check.C, syncer *Syncer, allEvents []*replicat Name: string(ev.Table.Table), } needSkip, err := syncer.skipRowsEvent(table, e.Header.EventType) - c.Assert(err, check.IsNil) - c.Assert(needSkip, check.Equals, res[i][0]) + require.NoError(t, err) + require.Equal(t, res[i][0], needSkip) default: continue } @@ -1540,21 +1542,21 @@ var defaultDMLType = map[sqlmodel.RowChangeType]sqlmodel.DMLType{ sqlmodel.RowChangeDelete: sqlmodel.DMLDelete, } -func checkJobs(c *check.C, jobs []*job, expectJobs []*expectJob) { - c.Assert(len(jobs), check.Equals, len(expectJobs), check.Commentf("jobs = %q", jobs)) +func checkJobs(t *testing.T, jobs []*job, expectJobs []*expectJob) { + require.Equal(t, len(expectJobs), len(jobs), "jobs = %q", jobs) for i, job := range jobs { - c.Assert(job.tp, check.Equals, expectJobs[i].tp) + require.Equal(t, expectJobs[i].tp, job.tp) if job.tp == ddl { - c.Assert(job.ddls, check.DeepEquals, expectJobs[i].sqlInJob) + require.Equal(t, expectJobs[i].sqlInJob, job.ddls) continue } if job.tp == dml { if !job.safeMode { sql, args := job.dml.GenSQL(defaultDMLType[job.dml.Type()]) - c.Assert([]string{sql}, check.DeepEquals, expectJobs[i].sqlInJob) - c.Assert([][]interface{}{args}, check.DeepEquals, expectJobs[i].args) + require.Equal(t, expectJobs[i].sqlInJob, []string{sql}) + require.Equal(t, expectJobs[i].args, [][]interface{}{args}) continue } @@ -1562,17 +1564,17 @@ func checkJobs(c *check.C, jobs []*job, expectJobs []*expectJob) { switch job.dml.Type() { case sqlmodel.RowChangeInsert: sql, args := job.dml.GenSQL(sqlmodel.DMLReplace) - c.Assert([]string{sql}, check.DeepEquals, expectJobs[i].sqlInJob) - c.Assert([][]interface{}{args}, check.DeepEquals, expectJobs[i].args) + require.Equal(t, expectJobs[i].sqlInJob, []string{sql}) + require.Equal(t, expectJobs[i].args, [][]interface{}{args}) case sqlmodel.RowChangeUpdate: sql, args := job.dml.GenSQL(sqlmodel.DMLDelete) sql2, args2 := job.dml.GenSQL(sqlmodel.DMLReplace) - c.Assert([]string{sql, sql2}, check.DeepEquals, expectJobs[i].sqlInJob) - c.Assert([][]interface{}{args, args2}, check.DeepEquals, expectJobs[i].args) + require.Equal(t, expectJobs[i].sqlInJob, []string{sql, sql2}) + require.Equal(t, expectJobs[i].args, [][]interface{}{args, args2}) case sqlmodel.RowChangeDelete: sql, args := job.dml.GenSQL(sqlmodel.DMLDelete) - c.Assert([]string{sql}, check.DeepEquals, expectJobs[i].sqlInJob) - c.Assert([][]interface{}{args}, check.DeepEquals, expectJobs[i].args) + require.Equal(t, expectJobs[i].sqlInJob, []string{sql}) + require.Equal(t, expectJobs[i].args, [][]interface{}{args}) } } } @@ -1645,7 +1647,7 @@ func (s *Syncer) addJobToMemory(job *job) (bool, error) { return true, nil } -func (s *Syncer) setupMockCheckpoint(c *check.C, checkPointDBConn *sql.Conn, checkPointMock sqlmock.Sqlmock) { +func (s *Syncer) setupMockCheckpoint(t *testing.T, checkPointDBConn *sql.Conn, checkPointMock sqlmock.Sqlmock) { checkPointMock.ExpectBegin() checkPointMock.ExpectExec(fmt.Sprintf("CREATE SCHEMA IF NOT EXISTS `%s`", s.cfg.MetaSchema)).WillReturnResult(sqlmock.NewResult(1, 1)) checkPointMock.ExpectCommit() @@ -1663,7 +1665,7 @@ func (s *Syncer) setupMockCheckpoint(c *check.C, checkPointDBConn *sql.Conn, che afterFlushFn: s.afterFlushCheckpoint, updateJobMetricsFn: func(bool, string, *job) {}, } - c.Assert(s.checkpoint.(*RemoteCheckPoint).prepare(tcontext.Background()), check.IsNil) + require.Nil(t, s.checkpoint.(*RemoteCheckPoint).prepare(tcontext.Background())) // disable flush checkpoint periodically s.checkpoint.(*RemoteCheckPoint).globalPointSaveTime = time.Now() } diff --git a/dm/unit/unit_test.go b/dm/unit/unit_test.go index 4202e2a0bc..07499ae8ef 100644 --- a/dm/unit/unit_test.go +++ b/dm/unit/unit_test.go @@ -19,7 +19,6 @@ import ( "testing" "github.com/go-sql-driver/mysql" - "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/lightning/common" tmysql "github.com/pingcap/tidb/pkg/parser/mysql" @@ -28,38 +27,31 @@ import ( "github.com/stretchr/testify/require" ) -func TestSuite(t *testing.T) { - check.TestingT(t) -} - -var _ = check.Suite(&testUnitSuite{}) - -type testUnitSuite struct{} - -func (t *testUnitSuite) TestIsCtxCanceledProcessErr(c *check.C) { +func TestIsCtxCanceledProcessErr(t *testing.T) { err := NewProcessError(context.Canceled) - c.Assert(IsCtxCanceledProcessErr(err), check.IsTrue) + require.True(t, IsCtxCanceledProcessErr(err)) err = NewProcessError(errors.New("123")) - c.Assert(IsCtxCanceledProcessErr(err), check.IsFalse) + require.False(t, IsCtxCanceledProcessErr(err)) terr := terror.ErrDBBadConn err = NewProcessError(terror.ErrDBBadConn) - c.Assert(err.GetErrCode(), check.Equals, int32(terr.Code())) - c.Assert(err.GetErrClass(), check.Equals, terr.Class().String()) - c.Assert(err.GetErrLevel(), check.Equals, terr.Level().String()) - c.Assert(err.GetMessage(), check.Equals, terr.Message()) - c.Assert(err.GetRawCause(), check.Equals, "") + require.Equal(t, int32(terr.Code()), err.GetErrCode()) + require.Equal(t, terr.Class().String(), err.GetErrClass()) + require.Equal(t, terr.Level().String(), err.GetErrLevel()) + require.Equal(t, terr.Message(), err.GetMessage()) + require.Equal(t, "", err.GetRawCause()) } -func (t *testUnitSuite) TestJoinProcessErrors(c *check.C) { +func TestJoinProcessErrors(t *testing.T) { errs := []*pb.ProcessError{ NewProcessError(terror.ErrDBDriverError.Generate()), NewProcessError(terror.ErrSyncUnitDMLStatementFound.Generate()), } - c.Assert(JoinProcessErrors(errs), check.Equals, - `ErrCode:10001 ErrClass:"database" ErrScope:"not-set" ErrLevel:"high" Message:"database driver error" Workaround:"Please check the database connection and the database config in configuration file." , ErrCode:36014 ErrClass:"sync-unit" ErrScope:"internal" ErrLevel:"high" Message:"only support ROW format binlog, unexpected DML statement found in query event" `) + require.Equal(t, + `ErrCode:10001 ErrClass:"database" ErrScope:"not-set" ErrLevel:"high" Message:"database driver error" Workaround:"Please check the database connection and the database config in configuration file." , ErrCode:36014 ErrClass:"sync-unit" ErrScope:"internal" ErrLevel:"high" Message:"only support ROW format binlog, unexpected DML statement found in query event" `, + JoinProcessErrors(errs)) } func TestIsResumableError(t *testing.T) { diff --git a/dm/worker/config_test.go b/dm/worker/config_test.go index 92a15e70c7..b9fba29bcc 100644 --- a/dm/worker/config_test.go +++ b/dm/worker/config_test.go @@ -17,49 +17,46 @@ import ( "flag" "os" "strings" + "testing" "github.com/kami-zh/go-capturer" - "github.com/pingcap/check" "github.com/pingcap/tiflow/dm/pkg/terror" + "github.com/stretchr/testify/require" ) -var ( - defaultConfigFile = "./dm-worker.toml" - _ = check.Suite(&testConfigSuite{}) -) - -type testConfigSuite struct{} +var defaultConfigFile = "./dm-worker.toml" -func (t *testConfigSuite) TestAdjustAddr(c *check.C) { +func TestAdjustAddr(t *testing.T) { cfg := NewConfig() - c.Assert(cfg.configFromFile(defaultConfigFile), check.IsNil) - c.Assert(cfg.adjust(), check.IsNil) + require.NoError(t, cfg.configFromFile(defaultConfigFile)) + require.NoError(t, cfg.adjust()) // invalid `advertise-addr` cfg.AdvertiseAddr = "127.0.0.1" - c.Assert(terror.ErrWorkerHostPortNotValid.Equal(cfg.adjust()), check.IsTrue) + require.True(t, terror.ErrWorkerHostPortNotValid.Equal(cfg.adjust())) cfg.AdvertiseAddr = "0.0.0.0:8262" - c.Assert(terror.ErrWorkerHostPortNotValid.Equal(cfg.adjust()), check.IsTrue) + require.True(t, terror.ErrWorkerHostPortNotValid.Equal(cfg.adjust())) // clear `advertise-addr`, still invalid because no `host` in `worker-addr`. cfg.AdvertiseAddr = "" - c.Assert(terror.ErrWorkerHostPortNotValid.Equal(cfg.adjust()), check.IsTrue) + require.True(t, terror.ErrWorkerHostPortNotValid.Equal(cfg.adjust())) // TICASE-956 cfg.WorkerAddr = "127.0.0.1:8262" - c.Assert(cfg.adjust(), check.IsNil) - c.Assert(cfg.AdvertiseAddr, check.Equals, cfg.WorkerAddr) + require.NoError(t, cfg.adjust()) + require.Equal(t, cfg.WorkerAddr, cfg.AdvertiseAddr) } -func (t *testConfigSuite) TestPrintSampleConfig(c *check.C) { +func TestPrintSampleConfig(t *testing.T) { buf, err := os.ReadFile(defaultConfigFile) - c.Assert(err, check.IsNil) + require.NoError(t, err) // test print sample config out := capturer.CaptureStdout(func() { cfg := NewConfig() err = cfg.Parse([]string{"-print-sample-config"}) - c.Assert(err, check.ErrorMatches, flag.ErrHelp.Error()) + require.Error(t, err) + require.Regexp(t, flag.ErrHelp.Error(), err.Error()) }) - c.Assert(strings.TrimSpace(out), check.Equals, strings.TrimSpace(string(buf))) + require.Equal(t, strings.TrimSpace(string(buf)), strings.TrimSpace(out)) } diff --git a/dm/worker/hub_test.go b/dm/worker/hub_test.go index f71ea1b0e0..8de0b8b93e 100644 --- a/dm/worker/hub_test.go +++ b/dm/worker/hub_test.go @@ -13,12 +13,8 @@ package worker -import ( - "github.com/pingcap/check" -) - -func (t *testServer) testConidtionHub(c *check.C, s *Server) { +func (t *testServer) testConidtionHub(s *Server) { // test condition hub - c.Assert(GetConditionHub(), check.NotNil) - c.Assert(GetConditionHub().w, check.DeepEquals, s.getSourceWorker(true)) + t.Require().NotNil(GetConditionHub()) + t.Require().Equal(s.getSourceWorker(true), GetConditionHub().w) } diff --git a/dm/worker/relay_test.go b/dm/worker/relay_test.go index 88232e42cf..d61e8b64e2 100644 --- a/dm/worker/relay_test.go +++ b/dm/worker/relay_test.go @@ -15,10 +15,10 @@ package worker import ( "context" + "testing" "time" "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tiflow/dm/config" "github.com/pingcap/tiflow/dm/config/dbconfig" @@ -29,12 +29,9 @@ import ( "github.com/pingcap/tiflow/dm/pkg/utils" "github.com/pingcap/tiflow/dm/relay" "github.com/pingcap/tiflow/dm/unit" + "github.com/stretchr/testify/require" ) -type testRelay struct{} - -var _ = check.Suite(&testRelay{}) - /*********** dummy relay log process unit, used only for testing *************/ // DummyRelay is a dummy relay. @@ -143,7 +140,7 @@ func (d *DummyRelay) PurgeRelayDir() error { return nil } -func (t *testRelay) TestRelay(c *check.C) { +func TestRelay(t *testing.T) { originNewRelay := relay.NewRelay relay.NewRelay = NewDummyRelay originNewPurger := relay.NewPurger @@ -153,73 +150,77 @@ func (t *testRelay) TestRelay(c *check.C) { relay.NewPurger = originNewPurger }() - cfg := loadSourceConfigWithoutPassword(c) + cfg := loadSourceConfigWithoutPassword(t) - dir := c.MkDir() + dir := t.TempDir() cfg.RelayDir = dir cfg.MetaDir = dir relayHolder := NewRealRelayHolder(cfg) - c.Assert(relayHolder, check.NotNil) + require.NotNil(t, relayHolder) holder, ok := relayHolder.(*realRelayHolder) - c.Assert(ok, check.IsTrue) + require.True(t, ok) - t.testInit(c, holder) - t.testStart(c, holder) - t.testPauseAndResume(c, holder) - t.testClose(c, holder) - t.testStop(c, holder) + testRelayInit(t, holder) + testRelayStart(t, holder) + testRelayPauseAndResume(t, holder) + testRelayClose(t, holder) + testRelayStop(t, holder) } -func (t *testRelay) testInit(c *check.C, holder *realRelayHolder) { +func testRelayInit(t *testing.T, holder *realRelayHolder) { + t.Helper() ctx := context.Background() _, err := holder.Init(ctx, nil) - c.Assert(err, check.IsNil) + require.NoError(t, err) r, ok := holder.relay.(*DummyRelay) - c.Assert(ok, check.IsTrue) + require.True(t, ok) initErr := errors.New("init error") r.InjectInitError(initErr) defer r.InjectInitError(nil) _, err = holder.Init(ctx, nil) - c.Assert(err, check.ErrorMatches, ".*"+initErr.Error()+".*") + require.Error(t, err) + require.Regexp(t, ".*"+initErr.Error()+".*", err.Error()) } -func (t *testRelay) testStart(c *check.C, holder *realRelayHolder) { - c.Assert(holder.Stage(), check.Equals, pb.Stage_New) - c.Assert(holder.closed.Load(), check.IsFalse) - c.Assert(holder.Result(), check.IsNil) +func testRelayStart(t *testing.T, holder *realRelayHolder) { + t.Helper() + require.Equal(t, pb.Stage_New, holder.Stage()) + require.False(t, holder.closed.Load()) + require.Nil(t, holder.Result()) holder.Start() - c.Assert(waitRelayStage(holder, pb.Stage_Running, 5), check.IsTrue) - c.Assert(holder.Result(), check.IsNil) - c.Assert(holder.closed.Load(), check.IsFalse) + require.True(t, waitRelayStage(holder, pb.Stage_Running, 5)) + require.Nil(t, holder.Result()) + require.False(t, holder.closed.Load()) // test status status := holder.Status(nil) - c.Assert(status.Stage, check.Equals, pb.Stage_Running) - c.Assert(status.Result, check.IsNil) + require.Equal(t, pb.Stage_Running, status.Stage) + require.Nil(t, status.Result) - c.Assert(holder.Error(), check.IsNil) + require.Nil(t, holder.Error()) // test update and pause -> resume - t.testUpdate(c, holder) - c.Assert(holder.Stage(), check.Equals, pb.Stage_Paused) - c.Assert(holder.closed.Load(), check.IsFalse) + testRelayUpdate(t, holder) + require.Equal(t, pb.Stage_Paused, holder.Stage()) + require.False(t, holder.closed.Load()) err := holder.Operate(context.Background(), pb.RelayOp_ResumeRelay) - c.Assert(err, check.IsNil) - c.Assert(waitRelayStage(holder, pb.Stage_Running, 10), check.IsTrue) - c.Assert(holder.Result(), check.IsNil) - c.Assert(holder.closed.Load(), check.IsFalse) + require.NoError(t, err) + require.True(t, waitRelayStage(holder, pb.Stage_Running, 10)) + require.Nil(t, holder.Result()) + require.False(t, holder.closed.Load()) } -func (t *testRelay) testClose(c *check.C, holder *realRelayHolder) { +func testRelayClose(t *testing.T, holder *realRelayHolder) { + t.Helper() r, ok := holder.relay.(*DummyRelay) - c.Assert(ok, check.IsTrue) + require.True(t, ok) processResult := &pb.ProcessResult{ IsCanceled: true, Errors: []*pb.ProcessError{ @@ -230,60 +231,65 @@ func (t *testRelay) testClose(c *check.C, holder *realRelayHolder) { defer r.InjectProcessResult(pb.ProcessResult{}) holder.Close() - c.Assert(waitRelayStage(holder, pb.Stage_Paused, 10), check.IsTrue) - c.Assert(holder.Result(), check.DeepEquals, processResult) - c.Assert(holder.closed.Load(), check.IsTrue) + require.True(t, waitRelayStage(holder, pb.Stage_Paused, 10)) + require.Equal(t, processResult, holder.Result()) + require.True(t, holder.closed.Load()) holder.Close() - c.Assert(holder.Stage(), check.Equals, pb.Stage_Paused) - c.Assert(holder.Result(), check.DeepEquals, processResult) - c.Assert(holder.closed.Load(), check.IsTrue) + require.Equal(t, pb.Stage_Paused, holder.Stage()) + require.Equal(t, processResult, holder.Result()) + require.True(t, holder.closed.Load()) // todo: very strange, and can't resume status := holder.Status(nil) - c.Assert(status.Stage, check.Equals, pb.Stage_Stopped) - c.Assert(status.Result, check.IsNil) + require.Equal(t, pb.Stage_Stopped, status.Stage) + require.Nil(t, status.Result) errInfo := holder.Error() - c.Assert(errInfo.Msg, check.Equals, "relay stopped") + require.Equal(t, "relay stopped", errInfo.Msg) } -func (t *testRelay) testPauseAndResume(c *check.C, holder *realRelayHolder) { +func testRelayPauseAndResume(t *testing.T, holder *realRelayHolder) { + t.Helper() err := holder.Operate(context.Background(), pb.RelayOp_PauseRelay) - c.Assert(err, check.IsNil) - c.Assert(holder.Stage(), check.Equals, pb.Stage_Paused) - c.Assert(holder.closed.Load(), check.IsFalse) + require.NoError(t, err) + require.Equal(t, pb.Stage_Paused, holder.Stage()) + require.False(t, holder.closed.Load()) err = holder.pauseRelay(context.Background(), pb.RelayOp_PauseRelay) - c.Assert(err, check.ErrorMatches, ".*current stage is Paused.*") + require.Error(t, err) + require.Regexp(t, ".*current stage is Paused.*", err.Error()) // test status status := holder.Status(nil) - c.Assert(status.Stage, check.Equals, pb.Stage_Paused) + require.Equal(t, pb.Stage_Paused, status.Stage) // test update - t.testUpdate(c, holder) + testRelayUpdate(t, holder) err = holder.Operate(context.Background(), pb.RelayOp_ResumeRelay) - c.Assert(err, check.IsNil) - c.Assert(waitRelayStage(holder, pb.Stage_Running, 10), check.IsTrue) - c.Assert(holder.Result(), check.IsNil) - c.Assert(holder.closed.Load(), check.IsFalse) + require.NoError(t, err) + require.True(t, waitRelayStage(holder, pb.Stage_Running, 10)) + require.Nil(t, holder.Result()) + require.False(t, holder.closed.Load()) err = holder.Operate(context.Background(), pb.RelayOp_ResumeRelay) - c.Assert(err, check.ErrorMatches, ".*current stage is Running.*") + require.Error(t, err) + require.Regexp(t, ".*current stage is Running.*", err.Error()) // test status status = holder.Status(nil) - c.Assert(status.Stage, check.Equals, pb.Stage_Running) - c.Assert(status.Result, check.IsNil) + require.Equal(t, pb.Stage_Running, status.Stage) + require.Nil(t, status.Result) // invalid operation err = holder.Operate(context.Background(), pb.RelayOp_InvalidRelayOp) - c.Assert(err, check.ErrorMatches, ".*not supported.*") + require.Error(t, err) + require.Regexp(t, ".*not supported.*", err.Error()) } -func (t *testRelay) testUpdate(c *check.C, holder *realRelayHolder) { +func testRelayUpdate(t *testing.T, holder *realRelayHolder) { + t.Helper() cfg := &config.SourceConfig{ From: dbconfig.DBConfig{ Host: "127.0.0.1", @@ -294,27 +300,29 @@ func (t *testRelay) testUpdate(c *check.C, holder *realRelayHolder) { } originStage := holder.Stage() - c.Assert(holder.Update(context.Background(), cfg), check.IsNil) - c.Assert(waitRelayStage(holder, originStage, 10), check.IsTrue) - c.Assert(holder.closed.Load(), check.IsFalse) + require.NoError(t, holder.Update(context.Background(), cfg)) + require.True(t, waitRelayStage(holder, originStage, 10)) + require.False(t, holder.closed.Load()) r, ok := holder.relay.(*DummyRelay) - c.Assert(ok, check.IsTrue) + require.True(t, ok) err := errors.New("reload error") r.InjectReloadError(err) defer r.InjectReloadError(nil) - c.Assert(holder.Update(context.Background(), cfg), check.Equals, err) + require.Equal(t, err, holder.Update(context.Background(), cfg)) } -func (t *testRelay) testStop(c *check.C, holder *realRelayHolder) { +func testRelayStop(t *testing.T, holder *realRelayHolder) { + t.Helper() err := holder.Operate(context.Background(), pb.RelayOp_StopRelay) - c.Assert(err, check.IsNil) - c.Assert(holder.Stage(), check.Equals, pb.Stage_Stopped) - c.Assert(holder.closed.Load(), check.IsTrue) + require.NoError(t, err) + require.Equal(t, pb.Stage_Stopped, holder.Stage()) + require.True(t, holder.closed.Load()) err = holder.Operate(context.Background(), pb.RelayOp_StopRelay) - c.Assert(err, check.ErrorMatches, ".*current stage is already stopped.*") + require.Error(t, err) + require.Regexp(t, ".*current stage is already stopped.*", err.Error()) } func waitRelayStage(holder *realRelayHolder, expect pb.Stage, backoff int) bool { diff --git a/dm/worker/server_test.go b/dm/worker/server_test.go index 8740df6c79..dce9ca9cd7 100644 --- a/dm/worker/server_test.go +++ b/dm/worker/server_test.go @@ -23,7 +23,6 @@ import ( "time" "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tiflow/dm/config" @@ -37,6 +36,7 @@ import ( "github.com/pingcap/tiflow/dm/relay" "github.com/pingcap/tiflow/dm/unit" "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "github.com/tikv/pd/pkg/utils/tempurl" v3rpc "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" clientv3 "go.etcd.io/etcd/client/v3" @@ -51,21 +51,26 @@ const ( var etcdErrCompacted = v3rpc.ErrCompacted -func TestServer(t *testing.T) { - check.TestingT(t) +// TestWorker is the single entry point that runs all stateful suites in the +// dm/worker package. +func TestWorker(t *testing.T) { + suite.Run(t, new(testServer)) + suite.Run(t, new(testServer2)) + suite.Run(t, new(testWorkerFunctionalities)) + suite.Run(t, new(testWorkerEtcdCompact)) } -type testServer struct{} - -var _ = check.Suite(&testServer{}) +type testServer struct { + suite.Suite +} -func (t *testServer) SetUpSuite(c *check.C) { +func (t *testServer) SetupSuite() { err := log.InitLogger(&log.Config{}) - c.Assert(err, check.IsNil) + t.Require().NoError(err) getMinLocForSubTaskFunc = getFakeLocForSubTask } -func (t *testServer) TearDownSuite(c *check.C) { +func (t *testServer) TearDownSuite() { getMinLocForSubTaskFunc = getMinLocForSubTask } @@ -96,17 +101,17 @@ func createMockETCD(dir string, host string) (*embed.Etcd, error) { return ETCD, nil } -func (t *testServer) TestServer(c *check.C) { +func (t *testServer) TestServer() { var ( masterAddr = tempurl.Alloc()[len("http://"):] workerAddr1 = "127.0.0.1:8262" keepAliveTTL = int64(1) ) - etcdDir := c.MkDir() + etcdDir := t.T().TempDir() ETCD, err := createMockETCD(etcdDir, "http://"+masterAddr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) cfg := NewConfig() - c.Assert(cfg.Parse([]string{"-config=./dm-worker.toml"}), check.IsNil) + t.Require().NoError(cfg.Parse([]string{"-config=./dm-worker.toml"})) cfg.Join = masterAddr cfg.KeepAliveTTL = keepAliveTTL cfg.RelayKeepAliveTTL = keepAliveTTL @@ -132,136 +137,136 @@ func (t *testServer) TestServer(c *check.C) { defer s.Close() go func() { err1 := s.Start() - c.Assert(err1, check.IsNil) + t.Require().NoError(err1) }() - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return !s.closed.Load() - }), check.IsTrue) - dir := c.MkDir() + })) + dir := t.T().TempDir() - t.testOperateSourceBoundWithoutConfigInEtcd(c, s) + t.testOperateSourceBoundWithoutConfigInEtcd(s) - t.testOperateWorker(c, s, dir, true) + t.testOperateWorker(s, dir, true) // check worker would retry connecting master rather than stop worker directly. - ETCD = t.testRetryConnectMaster(c, s, ETCD, etcdDir, masterAddr) + ETCD = t.testRetryConnectMaster(s, ETCD, etcdDir, masterAddr) // resume contact with ETCD and start worker again - t.testOperateWorker(c, s, dir, true) + t.testOperateWorker(s, dir, true) // test condition hub - t.testConidtionHub(c, s) + t.testConidtionHub(s) - t.testHTTPInterface(c, "status") - t.testHTTPInterface(c, "metrics") + t.testHTTPInterface("status") + t.testHTTPInterface("metrics") // create client - cli := t.createClient(c, workerAddr1) + cli := t.createClient(workerAddr1) // start task subtaskCfg := config.SubTaskConfig{} err = subtaskCfg.Decode(config.SampleSubtaskConfig, true) - c.Assert(err, check.IsNil) + t.Require().NoError(err) subtaskCfg.MydumperPath = mydumperPath - sourceCfg := loadSourceConfigWithoutPassword(c) + sourceCfg := loadSourceConfigWithoutPassword(t.T()) _, err = ha.PutSubTaskCfgStage(s.etcdClient, []config.SubTaskConfig{subtaskCfg}, []ha.Stage{ha.NewSubTaskStage(pb.Stage_Running, sourceCfg.SourceID, subtaskCfg.Name)}, nil) - c.Assert(err, check.IsNil) + t.Require().NoError(err) - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return checkSubTaskStatus(cli, pb.Stage_Running) - }), check.IsTrue) + })) - t.testSubTaskRecover(c, s, dir) + t.testSubTaskRecover(s, dir) // pause relay _, err = ha.PutRelayStage(s.etcdClient, ha.NewRelayStage(pb.Stage_Paused, sourceCfg.SourceID)) - c.Assert(err, check.IsNil) - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().NoError(err) + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return checkRelayStatus(cli, pb.Stage_Paused) - }), check.IsTrue) + })) // resume relay _, err = ha.PutRelayStage(s.etcdClient, ha.NewRelayStage(pb.Stage_Running, sourceCfg.SourceID)) - c.Assert(err, check.IsNil) - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().NoError(err) + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return checkRelayStatus(cli, pb.Stage_Running) - }), check.IsTrue) + })) // pause task _, err = ha.PutSubTaskStage(s.etcdClient, ha.NewSubTaskStage(pb.Stage_Paused, sourceCfg.SourceID, subtaskCfg.Name)) - c.Assert(err, check.IsNil) - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().NoError(err) + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return checkSubTaskStatus(cli, pb.Stage_Paused) - }), check.IsTrue) + })) // test refresh source cfg sourceCfg.MetaDir = "new meta" _, err = ha.PutSourceCfg(s.etcdClient, sourceCfg) - c.Assert(err, check.IsNil) - c.Assert(s.worker.refreshSourceCfg(), check.IsNil) - c.Assert(s.worker.cfg.MetaDir, check.Equals, sourceCfg.MetaDir) + t.Require().NoError(err) + t.Require().NoError(s.worker.refreshSourceCfg()) + t.Require().Equal(sourceCfg.MetaDir, s.worker.cfg.MetaDir) // check update subtask cfg failed tomlStr, tomlErr := subtaskCfg.Toml() - c.Assert(tomlErr, check.IsNil) + t.Require().NoError(tomlErr) ctx := context.Background() checkReq := &pb.CheckSubtasksCanUpdateRequest{SubtaskCfgTomlString: tomlStr} checkResp, checkErr := s.CheckSubtasksCanUpdate(ctx, checkReq) - c.Assert(checkErr, check.IsNil) - c.Assert(checkResp.Success, check.IsFalse) + t.Require().NoError(checkErr) + t.Require().False(checkResp.Success) // test refresh subtask cfg subtaskCfg.SyncerConfig.Batch = 111 _, err = ha.PutSubTaskCfgStage(s.etcdClient, []config.SubTaskConfig{subtaskCfg}, []ha.Stage{}, []ha.Stage{}) - c.Assert(err, check.IsNil) + t.Require().NoError(err) subTask := s.worker.subTaskHolder.findSubTask(subtaskCfg.Name) subTask.setCurrUnit(subTask.units[2]) // set to syncer unit - c.Assert(s.worker.tryRefreshSubTaskAndSourceConfig(subTask), check.IsNil) + t.Require().NoError(s.worker.tryRefreshSubTaskAndSourceConfig(subTask)) subtaskCfgInWorker := s.worker.subTaskHolder.findSubTask(subtaskCfg.Name) - c.Assert(subtaskCfgInWorker.cfg.SyncerConfig.Batch, check.Equals, subtaskCfg.SyncerConfig.Batch) + t.Require().Equal(subtaskCfg.SyncerConfig.Batch, subtaskCfgInWorker.cfg.SyncerConfig.Batch) // resume task _, err = ha.PutSubTaskStage(s.etcdClient, ha.NewSubTaskStage(pb.Stage_Running, sourceCfg.SourceID, subtaskCfg.Name)) - c.Assert(err, check.IsNil) - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().NoError(err) + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return checkSubTaskStatus(cli, pb.Stage_Running) - }), check.IsTrue) + })) // stop task _, err = ha.DeleteSubTaskStage(s.etcdClient, ha.NewSubTaskStage(pb.Stage_Stopped, sourceCfg.SourceID, subtaskCfg.Name)) - c.Assert(err, check.IsNil) - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().NoError(err) + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return s.getSourceWorker(true).subTaskHolder.findSubTask(subtaskCfg.Name) == nil - }), check.IsTrue) + })) dupServer := NewServer(cfg) err = dupServer.Start() - c.Assert(terror.ErrWorkerStartService.Equal(err), check.IsTrue) - c.Assert(err.Error(), check.Matches, ".*bind: address already in use.*") + t.Require().True(terror.ErrWorkerStartService.Equal(err)) + t.Require().Regexp(".*bind: address already in use.*", err.Error()) - t.testStopWorkerWhenLostConnect(c, s, ETCD) + t.testStopWorkerWhenLostConnect(s, ETCD) s.Close() - c.Assert(utils.WaitSomething(30, 10*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 10*time.Millisecond, func() bool { return s.closed.Load() - }), check.IsTrue) + })) // test source worker, just make sure testing sort - t.testSourceWorker(c) + t.testSourceWorker() } -func (t *testServer) TestHandleSourceBoundAfterError(c *check.C) { +func (t *testServer) TestHandleSourceBoundAfterError() { var ( masterAddr = tempurl.Alloc()[len("http://"):] keepAliveTTL = int64(1) ) // start etcd server - etcdDir := c.MkDir() + etcdDir := t.T().TempDir() ETCD, err := createMockETCD(etcdDir, "http://"+masterAddr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer ETCD.Close() cfg := NewConfig() - c.Assert(cfg.Parse([]string{"-config=./dm-worker.toml"}), check.IsNil) + t.Require().NoError(cfg.Parse([]string{"-config=./dm-worker.toml"})) cfg.Join = masterAddr cfg.KeepAliveTTL = keepAliveTTL @@ -272,7 +277,7 @@ func (t *testServer) TestHandleSourceBoundAfterError(c *check.C) { DialKeepAliveTime: keepaliveTime, DialKeepAliveTimeout: keepaliveTimeout, }) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // watch worker event(oneline or offline) var ( @@ -297,14 +302,14 @@ func (t *testServer) TestHandleSourceBoundAfterError(c *check.C) { defer s.Close() go func() { err1 := s.Start() - c.Assert(err1, check.IsNil) + t.Require().NoError(err1) }() - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return !s.closed.Load() - }), check.IsTrue) + })) // check if the worker is online - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { select { case ev := <-workerEvCh: if !ev.IsDeleted { @@ -313,20 +318,20 @@ func (t *testServer) TestHandleSourceBoundAfterError(c *check.C) { default: } return false - }), check.IsTrue) + })) // enable failpoint - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/ha/FailToGetSourceCfg", `return(true)`), check.IsNil) - sourceCfg := loadSourceConfigWithoutPassword(c) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/pkg/ha/FailToGetSourceCfg", `return(true)`)) + sourceCfg := loadSourceConfigWithoutPassword(t.T()) sourceCfg.EnableRelay = false _, err = ha.PutSourceCfg(etcdCli, sourceCfg) - c.Assert(err, check.IsNil) + t.Require().NoError(err) sourceBound := ha.NewSourceBound(sourceCfg.SourceID, s.cfg.Name) _, err = ha.PutSourceBound(etcdCli, sourceBound) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // do check until worker offline - c.Assert(utils.WaitSomething(50, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(50, 100*time.Millisecond, func() bool { select { case ev := <-workerEvCh: if ev.IsDeleted { @@ -335,10 +340,10 @@ func (t *testServer) TestHandleSourceBoundAfterError(c *check.C) { default: } return false - }), check.IsTrue) + })) // check if the worker is online - c.Assert(utils.WaitSomething(5, time.Duration(s.cfg.KeepAliveTTL)*time.Second, func() bool { + t.Require().True(utils.WaitSomething(5, time.Duration(s.cfg.KeepAliveTTL)*time.Second, func() bool { select { case ev := <-workerEvCh: if !ev.IsDeleted { @@ -347,106 +352,106 @@ func (t *testServer) TestHandleSourceBoundAfterError(c *check.C) { default: } return false - }), check.IsTrue) + })) // stop watching and disable failpoint cancel() wg.Wait() - c.Assert(failpoint.Disable("github.com/pingcap/tiflow/dm/pkg/ha/FailToGetSourceCfg"), check.IsNil) + t.Require().NoError(failpoint.Disable("github.com/pingcap/tiflow/dm/pkg/ha/FailToGetSourceCfg")) _, err = ha.PutSourceBound(etcdCli, sourceBound) - c.Assert(err, check.IsNil) + t.Require().NoError(err) _, err = ha.PutSourceCfg(etcdCli, sourceCfg) - c.Assert(err, check.IsNil) - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().NoError(err) + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return s.getSourceWorker(true) != nil - }), check.IsTrue) + })) _, err = ha.DeleteSourceBound(etcdCli, s.cfg.Name) - c.Assert(err, check.IsNil) - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().NoError(err) + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return s.getSourceWorker(true) == nil - }), check.IsTrue) + })) } -func (t *testServer) TestServerQueryValidator(c *check.C) { +func (t *testServer) TestServerQueryValidator() { var ( masterAddr = tempurl.Alloc()[len("http://"):] keepAliveTTL = int64(1) ) - etcdDir := c.MkDir() + etcdDir := t.T().TempDir() ETCD, err := createMockETCD(etcdDir, "http://"+masterAddr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer ETCD.Close() cfg := NewConfig() - c.Assert(cfg.Parse([]string{"-config=./dm-worker.toml"}), check.IsNil) + t.Require().NoError(cfg.Parse([]string{"-config=./dm-worker.toml"})) cfg.Join = masterAddr cfg.KeepAliveTTL = keepAliveTTL cfg.RelayKeepAliveTTL = keepAliveTTL s := NewServer(cfg) resp, err := s.GetWorkerValidatorStatus(context.Background(), &pb.GetValidationStatusRequest{}) - c.Assert(err, check.IsNil) - c.Assert(resp.Result, check.IsFalse) - c.Assert(resp.Msg, check.Matches, ".*no mysql source is being handled in the worker.*") + t.Require().NoError(err) + t.Require().False(resp.Result) + t.Require().Regexp(".*no mysql source is being handled in the worker.*", resp.Msg) } -func (t *testServer) TestServerQueryValidatorError(c *check.C) { +func (t *testServer) TestServerQueryValidatorError() { var ( masterAddr = tempurl.Alloc()[len("http://"):] keepAliveTTL = int64(1) ) - etcdDir := c.MkDir() + etcdDir := t.T().TempDir() ETCD, err := createMockETCD(etcdDir, "http://"+masterAddr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer ETCD.Close() cfg := NewConfig() - c.Assert(cfg.Parse([]string{"-config=./dm-worker.toml"}), check.IsNil) + t.Require().NoError(cfg.Parse([]string{"-config=./dm-worker.toml"})) cfg.Join = masterAddr cfg.KeepAliveTTL = keepAliveTTL cfg.RelayKeepAliveTTL = keepAliveTTL s := NewServer(cfg) resp, err := s.GetValidatorError(context.Background(), &pb.GetValidationErrorRequest{}) - c.Assert(err, check.IsNil) - c.Assert(resp.Result, check.IsFalse) - c.Assert(resp.Msg, check.Matches, ".*no mysql source is being handled in the worker.*") + t.Require().NoError(err) + t.Require().False(resp.Result) + t.Require().Regexp(".*no mysql source is being handled in the worker.*", resp.Msg) } -func (t *testServer) TestServerOperateValidatorError(c *check.C) { +func (t *testServer) TestServerOperateValidatorError() { var ( masterAddr = tempurl.Alloc()[len("http://"):] keepAliveTTL = int64(1) ) - etcdDir := c.MkDir() + etcdDir := t.T().TempDir() ETCD, err := createMockETCD(etcdDir, "http://"+masterAddr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer ETCD.Close() cfg := NewConfig() - c.Assert(cfg.Parse([]string{"-config=./dm-worker.toml"}), check.IsNil) + t.Require().NoError(cfg.Parse([]string{"-config=./dm-worker.toml"})) cfg.Join = masterAddr cfg.KeepAliveTTL = keepAliveTTL cfg.RelayKeepAliveTTL = keepAliveTTL s := NewServer(cfg) resp, err := s.OperateValidatorError(context.Background(), &pb.OperateValidationErrorRequest{}) - c.Assert(err, check.IsNil) - c.Assert(resp.Result, check.IsFalse) - c.Assert(resp.Msg, check.Matches, ".*no mysql source is being handled in the worker.*") + t.Require().NoError(err) + t.Require().False(resp.Result) + t.Require().Regexp(".*no mysql source is being handled in the worker.*", resp.Msg) } -func (t *testServer) TestWatchSourceBoundEtcdCompact(c *check.C) { +func (t *testServer) TestWatchSourceBoundEtcdCompact() { var ( masterAddr = tempurl.Alloc()[len("http://"):] keepAliveTTL = int64(1) startRev = int64(1) ) - etcdDir := c.MkDir() + etcdDir := t.T().TempDir() ETCD, err := createMockETCD(etcdDir, "http://"+masterAddr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer ETCD.Close() cfg := NewConfig() - c.Assert(cfg.Parse([]string{"-config=./dm-worker.toml"}), check.IsNil) + t.Require().NoError(cfg.Parse([]string{"-config=./dm-worker.toml"})) cfg.Join = masterAddr cfg.KeepAliveTTL = keepAliveTTL cfg.RelayKeepAliveTTL = keepAliveTTL @@ -460,8 +465,8 @@ func (t *testServer) TestWatchSourceBoundEtcdCompact(c *check.C) { }) s.etcdClient = etcdCli s.closed.Store(false) - c.Assert(err, check.IsNil) - sourceCfg := loadSourceConfigWithoutPassword(c) + t.Require().NoError(err) + sourceCfg := loadSourceConfigWithoutPassword(t.T()) sourceCfg.EnableRelay = false ctx, cancel := context.WithCancel(context.Background()) @@ -469,27 +474,27 @@ func (t *testServer) TestWatchSourceBoundEtcdCompact(c *check.C) { // step 1: Put a source config and source bound to this worker, then delete it _, err = ha.PutSourceCfg(etcdCli, sourceCfg) - c.Assert(err, check.IsNil) + t.Require().NoError(err) sourceBound := ha.NewSourceBound(sourceCfg.SourceID, cfg.Name) _, err = ha.PutSourceBound(etcdCli, sourceBound) - c.Assert(err, check.IsNil) + t.Require().NoError(err) rev, err := ha.DeleteSourceBound(etcdCli, cfg.Name) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // step 2: start source at this worker w, err := s.getOrStartWorker(sourceCfg, true) - c.Assert(err, check.IsNil) - c.Assert(w.EnableHandleSubtasks(), check.IsNil) + t.Require().NoError(err) + t.Require().NoError(w.EnableHandleSubtasks()) // step 3: trigger etcd compaction and check whether we can receive it through watcher _, err = etcdCli.Compact(ctx, rev) - c.Assert(err, check.IsNil) + t.Require().NoError(err) sourceBoundCh := make(chan ha.SourceBound, 10) sourceBoundErrCh := make(chan error, 10) ha.WatchSourceBound(ctx, etcdCli, cfg.Name, startRev, sourceBoundCh, sourceBoundErrCh) select { case err = <-sourceBoundErrCh: - c.Assert(errors.Cause(err), check.Equals, etcdErrCompacted) + t.Require().Equal(etcdErrCompacted, errors.Cause(err)) case <-time.After(300 * time.Millisecond): - c.Fatal("fail to get etcd error compacted") + t.T().Fatal("fail to get etcd error compacted") } // step 4: watch source bound from startRev var wg sync.WaitGroup @@ -497,121 +502,121 @@ func (t *testServer) TestWatchSourceBoundEtcdCompact(c *check.C) { wg.Add(1) go func() { defer wg.Done() - c.Assert(s.observeSourceBound(ctx1, startRev), check.IsNil) + t.Require().NoError(s.observeSourceBound(ctx1, startRev)) }() // step 4.1: should stop the running worker, source bound has been deleted, should stop this worker - c.Assert(utils.WaitSomething(20, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(20, 100*time.Millisecond, func() bool { return s.getSourceWorker(true) == nil - }), check.IsTrue) + })) // step 4.2: put a new source bound, source should be started _, err = ha.PutSourceBound(etcdCli, sourceBound) - c.Assert(err, check.IsNil) - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().NoError(err) + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return s.getSourceWorker(true) != nil - }), check.IsTrue) + })) cfg2 := s.getSourceWorker(true).cfg - c.Assert(cfg2, check.DeepEquals, sourceCfg) + t.Require().Equal(sourceCfg, cfg2) cancel1() wg.Wait() - c.Assert(s.stopSourceWorker(sourceCfg.SourceID, true, true), check.IsNil) + t.Require().NoError(s.stopSourceWorker(sourceCfg.SourceID, true, true)) // step 5: start observeSourceBound from compacted revision again, should start worker ctx2, cancel2 := context.WithCancel(ctx) wg.Add(1) go func() { defer wg.Done() - c.Assert(s.observeSourceBound(ctx2, startRev), check.IsNil) + t.Require().NoError(s.observeSourceBound(ctx2, startRev)) }() - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return s.getSourceWorker(true) != nil - }), check.IsTrue) + })) cfg2 = s.getSourceWorker(true).cfg - c.Assert(cfg2, check.DeepEquals, sourceCfg) + t.Require().Equal(sourceCfg, cfg2) cancel2() wg.Wait() } -func (t *testServer) testHTTPInterface(c *check.C, uri string) { +func (t *testServer) testHTTPInterface(uri string) { // nolint:noctx resp, err := http.Get("http://127.0.0.1:8262/" + uri) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer resp.Body.Close() - c.Assert(resp.StatusCode, check.Equals, 200) + t.Require().Equal(200, resp.StatusCode) _, err = io.ReadAll(resp.Body) - c.Assert(err, check.IsNil) + t.Require().NoError(err) } -func (t *testServer) createClient(c *check.C, addr string) pb.WorkerClient { +func (t *testServer) createClient(addr string) pb.WorkerClient { //nolint:staticcheck conn, err := grpc.Dial(addr, grpc.WithInsecure(), grpc.WithBackoffMaxDelay(3*time.Second)) - c.Assert(err, check.IsNil) + t.Require().NoError(err) return pb.NewWorkerClient(conn) } -func (t *testServer) testOperateSourceBoundWithoutConfigInEtcd(c *check.C, s *Server) { +func (t *testServer) testOperateSourceBoundWithoutConfigInEtcd(s *Server) { err := s.operateSourceBound(ha.NewSourceBound("sourceWithoutConfigInEtcd", s.cfg.Name)) - c.Assert(terror.ErrWorkerFailToGetSourceConfigFromEtcd.Equal(err), check.IsTrue) + t.Require().True(terror.ErrWorkerFailToGetSourceConfigFromEtcd.Equal(err)) } -func (t *testServer) testOperateWorker(c *check.C, s *Server, dir string, start bool) { +func (t *testServer) testOperateWorker(s *Server, dir string, start bool) { // load sourceCfg - sourceCfg := loadSourceConfigWithoutPassword(c) + sourceCfg := loadSourceConfigWithoutPassword(t.T()) sourceCfg.EnableRelay = true sourceCfg.RelayDir = dir - sourceCfg.MetaDir = c.MkDir() + sourceCfg.MetaDir = t.T().TempDir() if start { // put mysql config into relative etcd key adapter to trigger operation event _, err := ha.PutSourceCfg(s.etcdClient, sourceCfg) - c.Assert(err, check.IsNil) + t.Require().NoError(err) _, err = ha.PutRelayStageRelayConfigSourceBound(s.etcdClient, ha.NewRelayStage(pb.Stage_Running, sourceCfg.SourceID), ha.NewSourceBound(sourceCfg.SourceID, s.cfg.Name)) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // worker should be started and without error - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { w := s.getSourceWorker(true) return w != nil && !w.closed.Load() - }), check.IsTrue) - c.Assert(s.getSourceStatus(true).Result, check.IsNil) + })) + t.Require().Nil(s.getSourceStatus(true).Result) } else { // worker should be started before stopped w := s.getSourceWorker(true) - c.Assert(w, check.NotNil) - c.Assert(w.closed.Load(), check.IsFalse) + t.Require().NotNil(w) + t.Require().False(w.closed.Load()) _, err := ha.DeleteRelayConfig(s.etcdClient, w.name) - c.Assert(err, check.IsNil) + t.Require().NoError(err) _, err = ha.DeleteSourceCfgRelayStageSourceBound(s.etcdClient, sourceCfg.SourceID, s.cfg.Name) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // worker should be closed and without error - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { currentWorker := s.getSourceWorker(true) return currentWorker == nil && w.closed.Load() - }), check.IsTrue) - c.Assert(s.getSourceStatus(true).Result, check.IsNil) + })) + t.Require().Nil(s.getSourceStatus(true).Result) } } -func (t *testServer) testRetryConnectMaster(c *check.C, s *Server, etcd *embed.Etcd, dir string, hostName string) *embed.Etcd { +func (t *testServer) testRetryConnectMaster(s *Server, etcd *embed.Etcd, dir string, hostName string) *embed.Etcd { etcd.Close() time.Sleep(6 * time.Second) // When worker server fail to keepalive with etcd, server should close its worker - c.Assert(s.getSourceWorker(true), check.IsNil) - c.Assert(s.getSourceStatus(true).Result, check.IsNil) + t.Require().Nil(s.getSourceWorker(true)) + t.Require().Nil(s.getSourceStatus(true).Result) ETCD, err := createMockETCD(dir, "http://"+hostName) - c.Assert(err, check.IsNil) + t.Require().NoError(err) time.Sleep(3 * time.Second) return ETCD } -func (t *testServer) testSubTaskRecover(c *check.C, s *Server, dir string) { - workerCli := t.createClient(c, "127.0.0.1:8262") - t.testOperateWorker(c, s, dir, false) +func (t *testServer) testSubTaskRecover(s *Server, dir string) { + workerCli := t.createClient("127.0.0.1:8262") + t.testOperateWorker(s, dir, false) status, err := workerCli.QueryStatus(context.Background(), &pb.QueryStatusRequest{Name: "sub-task-name"}) - c.Assert(err, check.IsNil) - c.Assert(status.Result, check.IsFalse) - c.Assert(status.Msg, check.Equals, terror.ErrWorkerNoStart.Error()) + t.Require().NoError(err) + t.Require().False(status.Result) + t.Require().Equal(terror.ErrWorkerNoStart.Error(), status.Msg) - t.testOperateWorker(c, s, dir, true) + t.testOperateWorker(s, dir, true) // because we split starting worker and enabling handling subtasks into two parts, a query-status may occur between // them, thus get a result of no subtask running @@ -630,30 +635,30 @@ func (t *testServer) testSubTaskRecover(c *check.C, s *Server, dir string) { }) status, err = workerCli.QueryStatus(context.Background(), &pb.QueryStatusRequest{Name: "sub-task-name"}) - c.Assert(err, check.IsNil) - c.Assert(status.Result, check.IsTrue) - c.Assert(status.SubTaskStatus, check.HasLen, 1) - c.Assert(status.SubTaskStatus[0].Stage, check.Equals, pb.Stage_Running) + t.Require().NoError(err) + t.Require().True(status.Result) + t.Require().Len(status.SubTaskStatus, 1) + t.Require().Equal(pb.Stage_Running, status.SubTaskStatus[0].Stage) } -func (t *testServer) testStopWorkerWhenLostConnect(c *check.C, s *Server, etcd *embed.Etcd) { +func (t *testServer) testStopWorkerWhenLostConnect(s *Server, etcd *embed.Etcd) { etcd.Close() - c.Assert(utils.WaitSomething(int(defaultKeepAliveTTL+3), time.Second, func() bool { + t.Require().True(utils.WaitSomething(int(defaultKeepAliveTTL+3), time.Second, func() bool { return s.getSourceWorker(true) == nil - }), check.IsTrue) - c.Assert(s.getSourceWorker(true), check.IsNil) + })) + t.Require().Nil(s.getSourceWorker(true)) } -func (t *testServer) TestGetMinLocInAllSubTasks(c *check.C) { +func (t *testServer) TestGetMinLocInAllSubTasks() { subTaskCfg := map[string]config.SubTaskConfig{ "test2": {Name: "test2"}, "test3": {Name: "test3"}, "test1": {Name: "test1"}, } minLoc, err := getMinLocInAllSubTasks(context.Background(), subTaskCfg) - c.Assert(err, check.IsNil) - c.Assert(minLoc.Position.Name, check.Equals, "mysql-binlog.00001") - c.Assert(minLoc.Position.Pos, check.Equals, uint32(12)) + t.Require().NoError(err) + t.Require().Equal("mysql-binlog.00001", minLoc.Position.Name) + t.Require().Equal(uint32(12), minLoc.Position.Pos) for k, cfg := range subTaskCfg { cfg.EnableGTID = true @@ -661,9 +666,9 @@ func (t *testServer) TestGetMinLocInAllSubTasks(c *check.C) { } minLoc, err = getMinLocInAllSubTasks(context.Background(), subTaskCfg) - c.Assert(err, check.IsNil) - c.Assert(minLoc.Position.Name, check.Equals, "mysql-binlog.00001") - c.Assert(minLoc.Position.Pos, check.Equals, uint32(123)) + t.Require().NoError(err) + t.Require().Equal("mysql-binlog.00001", minLoc.Position.Name) + t.Require().Equal(uint32(123), minLoc.Position.Pos) } func getFakeLocForSubTask(ctx context.Context, subTaskCfg config.SubTaskConfig) (minLoc *binlog.Location, err error) { @@ -725,24 +730,24 @@ func checkRelayStatus(cli pb.WorkerClient, expect pb.Stage) bool { return status.SourceStatus.RelayStatus.Stage == expect } -func loadSourceConfigWithoutPassword(c *check.C) *config.SourceConfig { +func loadSourceConfigWithoutPassword(t require.TestingT) *config.SourceConfig { sourceCfg, err := config.SourceCfgFromYamlAndVerify(config.SampleSourceConfig) - c.Assert(err, check.IsNil) + require.NoError(t, err) sourceCfg.From.Password = "" // no password set return sourceCfg } -func (t *testServer) TestServerDataRace(c *check.C) { +func (t *testServer) TestServerDataRace() { var ( masterAddr = tempurl.Alloc()[len("http://"):] keepAliveTTL = int64(1) ) - etcdDir := c.MkDir() + etcdDir := t.T().TempDir() ETCD, err := createMockETCD(etcdDir, "http://"+masterAddr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer ETCD.Close() cfg := NewConfig() - c.Assert(cfg.Parse([]string{"-config=./dm-worker.toml"}), check.IsNil) + t.Require().NoError(cfg.Parse([]string{"-config=./dm-worker.toml"})) cfg.Join = masterAddr cfg.KeepAliveTTL = keepAliveTTL cfg.RelayKeepAliveTTL = keepAliveTTL @@ -756,7 +761,7 @@ func (t *testServer) TestServerDataRace(c *check.C) { go func() { defer wg.Done() err1 := s.Start() - c.Assert(err1 == nil || err1 == terror.ErrWorkerServerClosed, check.IsTrue) + t.Require().True(err1 == nil || err1 == terror.ErrWorkerServerClosed) }() go func() { defer wg.Done() diff --git a/dm/worker/source_worker_test.go b/dm/worker/source_worker_test.go index fe6ad63dce..44c3837e68 100644 --- a/dm/worker/source_worker_test.go +++ b/dm/worker/source_worker_test.go @@ -22,7 +22,6 @@ import ( "time" "github.com/DATA-DOG/go-sqlmock" - "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/testkit/testfailpoint" @@ -37,6 +36,7 @@ import ( "github.com/pingcap/tiflow/dm/syncer" "github.com/pingcap/tiflow/dm/unit" "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "github.com/tikv/pd/pkg/utils/tempurl" clientv3 "go.etcd.io/etcd/client/v3" ) @@ -55,40 +55,40 @@ func mockShowMasterStatusNoRows(mockDB sqlmock.Sqlmock) { mockDB.ExpectQuery(`SHOW MASTER STATUS`).WillReturnRows(rows) } -type testServer2 struct{} - -var _ = check.Suite(&testServer2{}) +type testServer2 struct { + suite.Suite +} -func (t *testServer2) SetUpSuite(c *check.C) { +func (t *testServer2) SetupSuite() { err := log.InitLogger(&log.Config{}) - c.Assert(err, check.IsNil) + t.Require().NoError(err) getMinLocForSubTaskFunc = getFakeLocForSubTask - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD", `return(true)`), check.IsNil) - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/worker/SkipRefreshFromETCDInUT", `return()`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD", `return(true)`)) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/worker/SkipRefreshFromETCDInUT", `return()`)) } -func (t *testServer2) TearDownSuite(c *check.C) { +func (t *testServer2) TearDownSuite() { getMinLocForSubTaskFunc = getMinLocForSubTask - c.Assert(failpoint.Disable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD"), check.IsNil) - c.Assert(failpoint.Disable("github.com/pingcap/tiflow/dm/worker/SkipRefreshFromETCDInUT"), check.IsNil) + t.Require().NoError(failpoint.Disable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD")) + t.Require().NoError(failpoint.Disable("github.com/pingcap/tiflow/dm/worker/SkipRefreshFromETCDInUT")) } -func (t *testServer2) TestTaskAutoResume(c *check.C) { +func (t *testServer2) TestTaskAutoResume() { var ( taskName = "sub-task-name" port = 8263 ) hostName := "127.0.0.1:18261" - etcdDir := c.MkDir() + etcdDir := t.T().TempDir() ETCD, err := createMockETCD(etcdDir, "http://"+hostName) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer ETCD.Close() cfg := NewConfig() - c.Assert(cfg.Parse([]string{"-config=./dm-worker.toml"}), check.IsNil) + t.Require().NoError(cfg.Parse([]string{"-config=./dm-worker.toml"})) cfg.Join = hostName - sourceConfig := loadSourceConfigWithoutPassword(c) + sourceConfig := loadSourceConfigWithoutPassword(t.T()) sourceConfig.Checker.CheckEnable = true sourceConfig.Checker.CheckInterval = config.Duration{Duration: 40 * time.Millisecond} sourceConfig.Checker.BackoffMin = config.Duration{Duration: 20 * time.Millisecond} @@ -96,7 +96,7 @@ func (t *testServer2) TestTaskAutoResume(c *check.C) { cfg.WorkerAddr = fmt.Sprintf(":%d", port) - dir := c.MkDir() + dir := t.T().TempDir() sourceConfig.RelayDir = dir sourceConfig.MetaDir = dir sourceConfig.EnableRelay = true @@ -106,45 +106,45 @@ func (t *testServer2) TestTaskAutoResume(c *check.C) { NewRelayHolder = NewRealRelayHolder }() - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessForever", `return()`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessForever", `return()`)) //nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessForever") - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/worker/mockCreateUnitsDumpOnly", `return(true)`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/worker/mockCreateUnitsDumpOnly", `return(true)`)) //nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/worker/mockCreateUnitsDumpOnly") - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/loader/ignoreLoadCheckpointErr", `return()`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/loader/ignoreLoadCheckpointErr", `return()`)) //nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/loader/ignoreLoadCheckpointErr") - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessWithError", `return("test auto resume inject error")`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessWithError", `return("test auto resume inject error")`)) //nolint:errcheck defer failpoint.Disable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessWithError") s := NewServer(cfg) defer s.Close() go func() { - c.Assert(s.Start(), check.IsNil) + t.Require().NoError(s.Start()) }() - c.Assert(utils.WaitSomething(10, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(10, 100*time.Millisecond, func() bool { if s.closed.Load() { return false } w, err2 := s.getOrStartWorker(sourceConfig, true) - c.Assert(err2, check.IsNil) + t.Require().NoError(err2) // we set sourceConfig.EnableRelay = true above - c.Assert(w.EnableRelay(false), check.IsNil) - c.Assert(w.EnableHandleSubtasks(), check.IsNil) + t.Require().NoError(w.EnableRelay(false)) + t.Require().NoError(w.EnableHandleSubtasks()) return true - }), check.IsTrue) + })) // start task var subtaskCfg config.SubTaskConfig - c.Assert(subtaskCfg.Decode(config.SampleSubtaskConfig, true), check.IsNil) - c.Assert(err, check.IsNil) + t.Require().NoError(subtaskCfg.Decode(config.SampleSubtaskConfig, true)) + t.Require().NoError(err) subtaskCfg.Mode = "full" subtaskCfg.Timezone = "UTC" - c.Assert(s.getSourceWorker(true).StartSubTask(&subtaskCfg, pb.Stage_Running, pb.Stage_Stopped, true), check.IsNil) + t.Require().NoError(s.getSourceWorker(true).StartSubTask(&subtaskCfg, pb.Stage_Running, pb.Stage_Stopped, true)) // check task in paused state - c.Assert(utils.WaitSomething(100, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(100, 100*time.Millisecond, func() bool { subtaskStatus, _, _ := s.getSourceWorker(true).QueryStatus(context.Background(), taskName) for _, st := range subtaskStatus { if st.Name == taskName && st.Stage == pb.Stage_Paused { @@ -152,12 +152,12 @@ func (t *testServer2) TestTaskAutoResume(c *check.C) { } } return false - }), check.IsTrue) + })) //nolint:errcheck failpoint.Disable("github.com/pingcap/tiflow/dm/dumpling/dumpUnitProcessWithError") rtsc, ok := s.getSourceWorker(true).taskStatusChecker.(*realTaskStatusChecker) - c.Assert(ok, check.IsTrue) + t.Require().True(ok) defer func() { // close multiple time rtsc.Close() @@ -165,26 +165,26 @@ func (t *testServer2) TestTaskAutoResume(c *check.C) { }() // check task will be auto resumed - c.Assert(utils.WaitSomething(10, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(10, 100*time.Millisecond, func() bool { sts, _, _ := s.getSourceWorker(true).QueryStatus(context.Background(), taskName) for _, st := range sts { if st.Name == taskName && st.Stage == pb.Stage_Running { return true } } - c.Log(sts) + t.T().Log(sts) return false - }), check.IsTrue) + })) } type testWorkerFunctionalities struct { + suite.Suite + createUnitCount int32 expectedCreateUnitCount int32 } -var _ = check.Suite(&testWorkerFunctionalities{}) - -func (t *testWorkerFunctionalities) SetUpSuite(c *check.C) { +func (t *testWorkerFunctionalities) SetupSuite() { NewRelayHolder = NewDummyRelayHolder NewSubTask = NewRealSubTask createUnits = func(cfg *config.SubTaskConfig, etcdClient *clientv3.Client, worker string, relay relay.Process) []unit.Unit { @@ -195,28 +195,28 @@ func (t *testWorkerFunctionalities) SetUpSuite(c *check.C) { return []unit.Unit{mockDumper, mockLoader, mockSync} } getMinLocForSubTaskFunc = getFakeLocForSubTask - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD", `return(true)`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD", `return(true)`)) } -func (t *testWorkerFunctionalities) TearDownSuite(c *check.C) { +func (t *testWorkerFunctionalities) TearDownSuite() { NewRelayHolder = NewRealRelayHolder NewSubTask = NewRealSubTask createUnits = createRealUnits getMinLocForSubTaskFunc = getMinLocForSubTask - c.Assert(failpoint.Disable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD"), check.IsNil) + t.Require().NoError(failpoint.Disable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD")) } -func (t *testWorkerFunctionalities) TestWorkerFunctionalities(c *check.C) { +func (t *testWorkerFunctionalities) TestWorkerFunctionalities() { var ( masterAddr = tempurl.Alloc()[len("http://"):] keepAliveTTL = int64(1) ) - etcdDir := c.MkDir() + etcdDir := t.T().TempDir() ETCD, err := createMockETCD(etcdDir, "http://"+masterAddr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer ETCD.Close() cfg := NewConfig() - c.Assert(cfg.Parse([]string{"-config=./dm-worker.toml"}), check.IsNil) + t.Require().NoError(cfg.Parse([]string{"-config=./dm-worker.toml"})) cfg.Join = masterAddr cfg.KeepAliveTTL = keepAliveTTL cfg.RelayKeepAliveTTL = keepAliveTTL @@ -227,137 +227,137 @@ func (t *testWorkerFunctionalities) TestWorkerFunctionalities(c *check.C) { DialKeepAliveTime: keepaliveTime, DialKeepAliveTimeout: keepaliveTimeout, }) - c.Assert(err, check.IsNil) - sourceCfg := loadSourceConfigWithoutPassword(c) + t.Require().NoError(err) + sourceCfg := loadSourceConfigWithoutPassword(t.T()) sourceCfg.EnableRelay = false subtaskCfg := config.SubTaskConfig{} err = subtaskCfg.Decode(config.SampleSubtaskConfig, true) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // start worker w, err := NewSourceWorker(sourceCfg, etcdCli, "", "") - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer w.Stop(true) go func() { w.Start() }() - c.Assert(utils.WaitSomething(50, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(50, 100*time.Millisecond, func() bool { return !w.closed.Load() - }), check.IsTrue) + })) // test 1: when subTaskEnabled is false, switch on relay - c.Assert(w.subTaskEnabled.Load(), check.IsFalse) - t.testEnableRelay(c, w, etcdCli, sourceCfg, cfg) + t.Require().False(w.subTaskEnabled.Load()) + t.testEnableRelay(w, etcdCli, sourceCfg, cfg) // test2: when subTaskEnabled is false, switch off relay - c.Assert(w.subTaskEnabled.Load(), check.IsFalse) - t.testDisableRelay(c, w) + t.Require().False(w.subTaskEnabled.Load()) + t.testDisableRelay(w) // test3: when relayEnabled is false, switch on subtask - c.Assert(w.relayEnabled.Load(), check.IsFalse) + t.Require().False(w.relayEnabled.Load()) - t.testEnableHandleSubtasks(c, w, etcdCli, subtaskCfg, sourceCfg) + t.testEnableHandleSubtasks(w, etcdCli, subtaskCfg, sourceCfg) // test4: when subTaskEnabled is true, switch on relay - c.Assert(w.subTaskEnabled.Load(), check.IsTrue) + t.Require().True(w.subTaskEnabled.Load()) - t.testEnableRelay(c, w, etcdCli, sourceCfg, cfg) - c.Assert(w.subTaskHolder.findSubTask(subtaskCfg.Name).cfg.UseRelay, check.IsTrue) + t.testEnableRelay(w, etcdCli, sourceCfg, cfg) + t.Require().True(w.subTaskHolder.findSubTask(subtaskCfg.Name).cfg.UseRelay) t.expectedCreateUnitCount++ - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return atomic.LoadInt32(&t.createUnitCount) == t.expectedCreateUnitCount - }), check.IsTrue) + })) // test5: when subTaskEnabled is true, switch off relay - c.Assert(w.subTaskEnabled.Load(), check.IsTrue) - t.testDisableRelay(c, w) + t.Require().True(w.subTaskEnabled.Load()) + t.testDisableRelay(w) - c.Assert(w.subTaskHolder.findSubTask(subtaskCfg.Name).cfg.UseRelay, check.IsFalse) + t.Require().False(w.subTaskHolder.findSubTask(subtaskCfg.Name).cfg.UseRelay) t.expectedCreateUnitCount++ - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return atomic.LoadInt32(&t.createUnitCount) == t.expectedCreateUnitCount - }), check.IsTrue) + })) // test6: when relayEnabled is false, switch off subtask - c.Assert(w.relayEnabled.Load(), check.IsFalse) + t.Require().False(w.relayEnabled.Load()) w.DisableHandleSubtasks() - c.Assert(w.subTaskEnabled.Load(), check.IsFalse) + t.Require().False(w.subTaskEnabled.Load()) // prepare for test7 & 8 - t.testEnableRelay(c, w, etcdCli, sourceCfg, cfg) + t.testEnableRelay(w, etcdCli, sourceCfg, cfg) // test7: when relayEnabled is true, switch on subtask - c.Assert(w.relayEnabled.Load(), check.IsTrue) + t.Require().True(w.relayEnabled.Load()) subtaskCfg2 := subtaskCfg subtaskCfg2.Name = "sub-task-name-2" // we already added subtaskCfg, so below EnableHandleSubtasks will find an extra subtask t.expectedCreateUnitCount++ - t.testEnableHandleSubtasks(c, w, etcdCli, subtaskCfg2, sourceCfg) - c.Assert(w.subTaskHolder.findSubTask(subtaskCfg.Name).cfg.UseRelay, check.IsTrue) - c.Assert(w.subTaskHolder.findSubTask(subtaskCfg2.Name).cfg.UseRelay, check.IsTrue) + t.testEnableHandleSubtasks(w, etcdCli, subtaskCfg2, sourceCfg) + t.Require().True(w.subTaskHolder.findSubTask(subtaskCfg.Name).cfg.UseRelay) + t.Require().True(w.subTaskHolder.findSubTask(subtaskCfg2.Name).cfg.UseRelay) // test8: when relayEnabled is true, switch off subtask - c.Assert(w.relayEnabled.Load(), check.IsTrue) + t.Require().True(w.relayEnabled.Load()) w.DisableHandleSubtasks() - c.Assert(w.subTaskEnabled.Load(), check.IsFalse) + t.Require().False(w.subTaskEnabled.Load()) } -func (t *testWorkerFunctionalities) testEnableRelay(c *check.C, w *SourceWorker, etcdCli *clientv3.Client, +func (t *testWorkerFunctionalities) testEnableRelay(w *SourceWorker, etcdCli *clientv3.Client, sourceCfg *config.SourceConfig, cfg *Config, ) { - c.Assert(w.EnableRelay(false), check.IsNil) + t.Require().NoError(w.EnableRelay(false)) - c.Assert(w.relayEnabled.Load(), check.IsTrue) - c.Assert(w.relayHolder.Stage(), check.Equals, pb.Stage_New) + t.Require().True(w.relayEnabled.Load()) + t.Require().Equal(pb.Stage_New, w.relayHolder.Stage()) _, err := ha.PutSourceCfg(etcdCli, sourceCfg) - c.Assert(err, check.IsNil) + t.Require().NoError(err) _, err = ha.PutRelayStageRelayConfigSourceBound(etcdCli, ha.NewRelayStage(pb.Stage_Running, sourceCfg.SourceID), ha.NewSourceBound(sourceCfg.SourceID, cfg.Name)) - c.Assert(err, check.IsNil) - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().NoError(err) + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return w.relayHolder.Stage() == pb.Stage_Running - }), check.IsTrue) + })) _, err = ha.DeleteSourceCfgRelayStageSourceBound(etcdCli, sourceCfg.SourceID, cfg.Name) - c.Assert(err, check.IsNil) - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().NoError(err) + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return w.relayHolder.Stage() == pb.Stage_Stopped - }), check.IsTrue) + })) } -func (t *testWorkerFunctionalities) testDisableRelay(c *check.C, w *SourceWorker) { +func (t *testWorkerFunctionalities) testDisableRelay(w *SourceWorker) { w.DisableRelay() - c.Assert(w.relayEnabled.Load(), check.IsFalse) - c.Assert(w.relayHolder, check.IsNil) + t.Require().False(w.relayEnabled.Load()) + t.Require().Nil(w.relayHolder) } -func (t *testWorkerFunctionalities) testEnableHandleSubtasks(c *check.C, w *SourceWorker, etcdCli *clientv3.Client, +func (t *testWorkerFunctionalities) testEnableHandleSubtasks(w *SourceWorker, etcdCli *clientv3.Client, subtaskCfg config.SubTaskConfig, sourceCfg *config.SourceConfig, ) { - c.Assert(w.EnableHandleSubtasks(), check.IsNil) - c.Assert(w.subTaskEnabled.Load(), check.IsTrue) + t.Require().NoError(w.EnableHandleSubtasks()) + t.Require().True(w.subTaskEnabled.Load()) _, err := ha.PutSubTaskCfgStage(etcdCli, []config.SubTaskConfig{subtaskCfg}, []ha.Stage{ha.NewSubTaskStage(pb.Stage_Running, sourceCfg.SourceID, subtaskCfg.Name)}, nil) - c.Assert(err, check.IsNil) - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().NoError(err) + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return w.subTaskHolder.findSubTask(subtaskCfg.Name) != nil - }), check.IsTrue) + })) t.expectedCreateUnitCount++ - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return atomic.LoadInt32(&t.createUnitCount) == t.expectedCreateUnitCount - }), check.IsTrue) + })) } -type testWorkerEtcdCompact struct{} - -var _ = check.Suite(&testWorkerEtcdCompact{}) +type testWorkerEtcdCompact struct { + suite.Suite +} -func (t *testWorkerEtcdCompact) SetUpSuite(c *check.C) { +func (t *testWorkerEtcdCompact) SetupSuite() { NewRelayHolder = NewDummyRelayHolder NewSubTask = func(cfg *config.SubTaskConfig, etcdClient *clientv3.Client, worker string) *SubTask { cfg.UseRelay = false @@ -369,29 +369,29 @@ func (t *testWorkerEtcdCompact) SetUpSuite(c *check.C) { mockSync := NewMockUnit(pb.UnitType_Sync) return []unit.Unit{mockDumper, mockLoader, mockSync} } - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD", `return(true)`), check.IsNil) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD", `return(true)`)) } -func (t *testWorkerEtcdCompact) TearDownSuite(c *check.C) { +func (t *testWorkerEtcdCompact) TearDownSuite() { NewRelayHolder = NewRealRelayHolder NewSubTask = NewRealSubTask createUnits = createRealUnits - c.Assert(failpoint.Disable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD"), check.IsNil) + t.Require().NoError(failpoint.Disable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD")) } -func (t *testWorkerEtcdCompact) TestWatchSubtaskStageEtcdCompact(c *check.C) { +func (t *testWorkerEtcdCompact) TestWatchSubtaskStageEtcdCompact() { var ( masterAddr = tempurl.Alloc()[len("http://"):] keepAliveTTL = int64(1) startRev = int64(1) ) - etcdDir := c.MkDir() + etcdDir := t.T().TempDir() ETCD, err := createMockETCD(etcdDir, "http://"+masterAddr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer ETCD.Close() cfg := NewConfig() - c.Assert(cfg.Parse([]string{"-config=./dm-worker.toml"}), check.IsNil) + t.Require().NoError(cfg.Parse([]string{"-config=./dm-worker.toml"})) cfg.Join = masterAddr cfg.KeepAliveTTL = keepAliveTTL cfg.RelayKeepAliveTTL = keepAliveTTL @@ -402,75 +402,75 @@ func (t *testWorkerEtcdCompact) TestWatchSubtaskStageEtcdCompact(c *check.C) { DialKeepAliveTime: keepaliveTime, DialKeepAliveTimeout: keepaliveTimeout, }) - c.Assert(err, check.IsNil) - sourceCfg := loadSourceConfigWithoutPassword(c) + t.Require().NoError(err) + sourceCfg := loadSourceConfigWithoutPassword(t.T()) sourceCfg.From = config.GetDBConfigForTest() sourceCfg.EnableRelay = false // step 1: start worker w, err := NewSourceWorker(sourceCfg, etcdCli, "", "") - c.Assert(err, check.IsNil) + t.Require().NoError(err) ctx, cancel := context.WithCancel(context.Background()) defer cancel() defer w.Stop(true) go func() { w.Start() }() - c.Assert(utils.WaitSomething(50, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(50, 100*time.Millisecond, func() bool { return !w.closed.Load() - }), check.IsTrue) + })) // step 2: Put a subtask config and subtask stage to this source, then delete it subtaskCfg := config.SubTaskConfig{} err = subtaskCfg.Decode(config.SampleSubtaskConfig, true) - c.Assert(err, check.IsNil) + t.Require().NoError(err) subtaskCfg.MydumperPath = mydumperPath _, err = ha.PutSubTaskCfgStage(etcdCli, []config.SubTaskConfig{subtaskCfg}, []ha.Stage{ha.NewSubTaskStage(pb.Stage_Running, sourceCfg.SourceID, subtaskCfg.Name)}, nil) - c.Assert(err, check.IsNil) + t.Require().NoError(err) rev, err := ha.DeleteSubTaskCfgStage(etcdCli, []config.SubTaskConfig{subtaskCfg}, []ha.Stage{ha.NewSubTaskStage(pb.Stage_Stopped, sourceCfg.SourceID, subtaskCfg.Name)}, nil) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // step 2.1: start a subtask manually - c.Assert(w.StartSubTask(&subtaskCfg, pb.Stage_Running, pb.Stage_Stopped, true), check.IsNil) + t.Require().NoError(w.StartSubTask(&subtaskCfg, pb.Stage_Running, pb.Stage_Stopped, true)) // step 3: trigger etcd compaction and check whether we can receive it through watcher _, err = etcdCli.Compact(ctx, rev) - c.Assert(err, check.IsNil) + t.Require().NoError(err) subTaskStageCh := make(chan ha.Stage, 10) subTaskErrCh := make(chan error, 10) ha.WatchSubTaskStage(ctx, etcdCli, sourceCfg.SourceID, startRev, subTaskStageCh, subTaskErrCh) select { case err = <-subTaskErrCh: - c.Assert(errors.Cause(err), check.Equals, etcdErrCompacted) + t.Require().Equal(etcdErrCompacted, errors.Cause(err)) case <-time.After(300 * time.Millisecond): - c.Fatal("fail to get etcd error compacted") + t.T().Fatal("fail to get etcd error compacted") } // step 4: watch subtask stage from startRev - c.Assert(w.subTaskHolder.findSubTask(subtaskCfg.Name), check.NotNil) + t.Require().NotNil(w.subTaskHolder.findSubTask(subtaskCfg.Name)) var wg sync.WaitGroup ctx1, cancel1 := context.WithCancel(ctx) wg.Add(1) go func() { defer wg.Done() - c.Assert(w.observeSubtaskStage(ctx1, etcdCli, startRev), check.IsNil) + t.Require().NoError(w.observeSubtaskStage(ctx1, etcdCli, startRev)) }() time.Sleep(time.Second) // step 4.1: after observe, invalid subtask should be removed - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return w.subTaskHolder.findSubTask(subtaskCfg.Name) == nil - }), check.IsTrue) + })) // step 4.2: add a new subtask stage, worker should receive and start it _, err = ha.PutSubTaskCfgStage(etcdCli, []config.SubTaskConfig{subtaskCfg}, []ha.Stage{ha.NewSubTaskStage(pb.Stage_Running, sourceCfg.SourceID, subtaskCfg.Name)}, nil) - c.Assert(err, check.IsNil) - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().NoError(err) + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return w.subTaskHolder.findSubTask(subtaskCfg.Name) != nil - }), check.IsTrue) - mockDB := conn.InitMockDB(c) + })) + mockDB := conn.InitMockDB(t.T()) mockShowMasterStatus(mockDB) status, _, err := w.QueryStatus(ctx1, subtaskCfg.Name) - c.Assert(err, check.IsNil) - c.Assert(status, check.HasLen, 1) - c.Assert(status[0].Name, check.Equals, subtaskCfg.Name) - c.Assert(status[0].Stage, check.Equals, pb.Stage_Running) + t.Require().NoError(err) + t.Require().Len(status, 1) + t.Require().Equal(subtaskCfg.Name, status[0].Name) + t.Require().Equal(pb.Stage_Running, status[0].Stage) cancel1() wg.Wait() w.subTaskHolder.closeAllSubTasks() @@ -479,36 +479,36 @@ func (t *testWorkerEtcdCompact) TestWatchSubtaskStageEtcdCompact(c *check.C) { wg.Add(1) go func() { defer wg.Done() - c.Assert(w.observeSubtaskStage(ctx2, etcdCli, startRev), check.IsNil) + t.Require().NoError(w.observeSubtaskStage(ctx2, etcdCli, startRev)) }() time.Sleep(time.Second) - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return w.subTaskHolder.findSubTask(subtaskCfg.Name) != nil - }), check.IsTrue) + })) mockShowMasterStatus(mockDB) status, _, err = w.QueryStatus(ctx2, subtaskCfg.Name) - c.Assert(err, check.IsNil) - c.Assert(status, check.HasLen, 1) - c.Assert(status[0].Name, check.Equals, subtaskCfg.Name) - c.Assert(status[0].Stage, check.Equals, pb.Stage_Running) + t.Require().NoError(err) + t.Require().Len(status, 1) + t.Require().Equal(subtaskCfg.Name, status[0].Name) + t.Require().Equal(pb.Stage_Running, status[0].Stage) w.Stop(true) cancel2() wg.Wait() } -func (t *testWorkerEtcdCompact) TestWatchValidatorStageEtcdCompact(c *check.C) { +func (t *testWorkerEtcdCompact) TestWatchValidatorStageEtcdCompact() { var ( masterAddr = tempurl.Alloc()[len("http://"):] keepAliveTTL = int64(1) startRev = int64(1) ) - etcdDir := c.MkDir() + etcdDir := t.T().TempDir() ETCD, err := createMockETCD(etcdDir, "http://"+masterAddr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer ETCD.Close() cfg := NewConfig() - c.Assert(cfg.Parse([]string{"-config=./dm-worker.toml"}), check.IsNil) + t.Require().NoError(cfg.Parse([]string{"-config=./dm-worker.toml"})) cfg.Join = masterAddr cfg.KeepAliveTTL = keepAliveTTL cfg.RelayKeepAliveTTL = keepAliveTTL @@ -519,56 +519,56 @@ func (t *testWorkerEtcdCompact) TestWatchValidatorStageEtcdCompact(c *check.C) { DialKeepAliveTime: keepaliveTime, DialKeepAliveTimeout: keepaliveTimeout, }) - c.Assert(err, check.IsNil) - sourceCfg := loadSourceConfigWithoutPassword(c) + t.Require().NoError(err) + sourceCfg := loadSourceConfigWithoutPassword(t.T()) sourceCfg.From = config.GetDBConfigForTest() sourceCfg.EnableRelay = false // // step 1: start worker w, err := NewSourceWorker(sourceCfg, etcdCli, "", "") - c.Assert(err, check.IsNil) + t.Require().NoError(err) ctx, cancel := context.WithCancel(context.Background()) defer cancel() defer w.Stop(true) go func() { w.Start() }() - c.Assert(utils.WaitSomething(50, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(50, 100*time.Millisecond, func() bool { return !w.closed.Load() - }), check.IsTrue) + })) // // step 2: Put a subtask config and subtask stage to this source, then delete it subtaskCfg := config.SubTaskConfig{} err = subtaskCfg.Decode(config.SampleSubtaskConfig, true) - c.Assert(err, check.IsNil) + t.Require().NoError(err) subtaskCfg.MydumperPath = mydumperPath subtaskCfg.ValidatorCfg = config.ValidatorConfig{Mode: config.ValidationNone} // increase revision _, err = etcdCli.Put(context.Background(), "/dummy-key", "value") - c.Assert(err, check.IsNil) + t.Require().NoError(err) rev, err := ha.PutSubTaskCfgStage(etcdCli, []config.SubTaskConfig{subtaskCfg}, []ha.Stage{ha.NewSubTaskStage(pb.Stage_Running, sourceCfg.SourceID, subtaskCfg.Name)}, nil) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // // step 2.1: start a subtask manually - c.Assert(w.StartSubTask(&subtaskCfg, pb.Stage_Running, pb.Stage_Stopped, true), check.IsNil) + t.Require().NoError(w.StartSubTask(&subtaskCfg, pb.Stage_Running, pb.Stage_Stopped, true)) // // step 3: trigger etcd compaction and check whether we can receive it through watcher _, err = etcdCli.Compact(ctx, rev) - c.Assert(err, check.IsNil) + t.Require().NoError(err) subTaskStageCh := make(chan ha.Stage, 10) subTaskErrCh := make(chan error, 10) ctxForWatch, cancelFunc := context.WithCancel(ctx) ha.WatchValidatorStage(ctxForWatch, etcdCli, sourceCfg.SourceID, startRev, subTaskStageCh, subTaskErrCh) select { case err = <-subTaskErrCh: - c.Assert(errors.Cause(err), check.Equals, etcdErrCompacted) + t.Require().Equal(etcdErrCompacted, errors.Cause(err)) case <-time.After(300 * time.Millisecond): - c.Fatal("fail to get etcd error compacted") + t.T().Fatal("fail to get etcd error compacted") } cancelFunc() @@ -580,14 +580,14 @@ func (t *testWorkerEtcdCompact) TestWatchValidatorStageEtcdCompact(c *check.C) { defer subTask.RUnlock() return subTask.validator } - c.Assert(subTask, check.NotNil) - c.Assert(getValidator(), check.IsNil) + t.Require().NotNil(subTask) + t.Require().Nil(getValidator()) var wg sync.WaitGroup ctx1, cancel1 := context.WithCancel(ctx) wg.Add(1) go func() { defer wg.Done() - c.Assert(w.observeValidatorStage(ctx1, startRev), check.IsNil) + t.Require().NoError(w.observeValidatorStage(ctx1, startRev)) }() time.Sleep(time.Second) @@ -596,12 +596,12 @@ func (t *testWorkerEtcdCompact) TestWatchValidatorStageEtcdCompact(c *check.C) { subTask.units[len(subTask.units)-1] = &syncer.Syncer{} // validator need a Syncer, not a mocked unit validatorStage := ha.NewValidatorStage(pb.Stage_Running, subtaskCfg.SourceID, subtaskCfg.Name) _, err = ha.PutSubTaskCfgStage(etcdCli, []config.SubTaskConfig{subtaskCfg}, nil, []ha.Stage{validatorStage}) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // validator created - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return getValidator() != nil - }), check.IsTrue) + })) subTask.units[len(subTask.units)-1] = unitBakup // restore unit cancel1() @@ -609,27 +609,28 @@ func (t *testWorkerEtcdCompact) TestWatchValidatorStageEtcdCompact(c *check.C) { // test operate validator err = w.operateValidatorStage(ha.Stage{IsDeleted: true}) - c.Assert(err, check.IsNil) + t.Require().NoError(err) err = w.operateValidatorStage(ha.Stage{Expect: pb.Stage_Running, Task: "not-exist"}) - c.Assert(err, check.IsNil) + t.Require().NoError(err) err = w.operateValidatorStage(ha.Stage{Expect: pb.Stage_Running, Task: subtaskCfg.Name}) - c.Assert(err, check.ErrorMatches, ".*failed to get subtask config.*") + t.Require().Error(err) + t.Require().Regexp(".*failed to get subtask config.*", err.Error()) err = w.operateValidatorStage(ha.Stage{Expect: pb.Stage_Running, Source: subtaskCfg.SourceID, Task: subtaskCfg.Name}) - c.Assert(err, check.IsNil) + t.Require().NoError(err) } -func (t *testWorkerEtcdCompact) TestWatchRelayStageEtcdCompact(c *check.C) { +func (t *testWorkerEtcdCompact) TestWatchRelayStageEtcdCompact() { var ( masterAddr = tempurl.Alloc()[len("http://"):] keepAliveTTL = int64(1) startRev = int64(1) ) - etcdDir := c.MkDir() + etcdDir := t.T().TempDir() ETCD, err := createMockETCD(etcdDir, "http://"+masterAddr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer ETCD.Close() cfg := NewConfig() - c.Assert(cfg.Parse([]string{"-config=./dm-worker.toml"}), check.IsNil) + t.Require().NoError(cfg.Parse([]string{"-config=./dm-worker.toml"})) cfg.Join = masterAddr cfg.KeepAliveTTL = keepAliveTTL cfg.RelayKeepAliveTTL = keepAliveTTL @@ -640,62 +641,62 @@ func (t *testWorkerEtcdCompact) TestWatchRelayStageEtcdCompact(c *check.C) { DialKeepAliveTime: keepaliveTime, DialKeepAliveTimeout: keepaliveTimeout, }) - c.Assert(err, check.IsNil) - sourceCfg := loadSourceConfigWithoutPassword(c) + t.Require().NoError(err) + sourceCfg := loadSourceConfigWithoutPassword(t.T()) sourceCfg.EnableRelay = true - sourceCfg.RelayDir = c.MkDir() - sourceCfg.MetaDir = c.MkDir() + sourceCfg.RelayDir = t.T().TempDir() + sourceCfg.MetaDir = t.T().TempDir() // step 1: start worker w, err := NewSourceWorker(sourceCfg, etcdCli, "", "") - c.Assert(err, check.IsNil) + t.Require().NoError(err) ctx, cancel := context.WithCancel(context.Background()) defer cancel() defer w.Stop(true) go func() { - c.Assert(w.EnableRelay(false), check.IsNil) + t.Require().NoError(w.EnableRelay(false)) w.Start() }() - c.Assert(utils.WaitSomething(50, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(50, 100*time.Millisecond, func() bool { return !w.closed.Load() - }), check.IsTrue) + })) // step 2: Put a relay stage to this source, then delete it // put mysql config into relative etcd key adapter to trigger operation event - c.Assert(w.relayHolder, check.NotNil) + t.Require().NotNil(w.relayHolder) _, err = ha.PutSourceCfg(etcdCli, sourceCfg) - c.Assert(err, check.IsNil) + t.Require().NoError(err) rev, err := ha.PutRelayStageRelayConfigSourceBound(etcdCli, ha.NewRelayStage(pb.Stage_Running, sourceCfg.SourceID), ha.NewSourceBound(sourceCfg.SourceID, cfg.Name)) - c.Assert(err, check.IsNil) + t.Require().NoError(err) // check relay stage, should be running - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return w.relayHolder.Stage() == pb.Stage_Running - }), check.IsTrue) + })) // step 3: trigger etcd compaction and check whether we can receive it through watcher, then we delete relay stage _, err = etcdCli.Compact(ctx, rev) - c.Assert(err, check.IsNil) + t.Require().NoError(err) _, err = ha.DeleteSourceCfgRelayStageSourceBound(etcdCli, sourceCfg.SourceID, cfg.Name) - c.Assert(err, check.IsNil) + t.Require().NoError(err) relayStageCh := make(chan ha.Stage, 10) relayErrCh := make(chan error, 10) ha.WatchRelayStage(ctx, etcdCli, cfg.Name, startRev, relayStageCh, relayErrCh) select { case err := <-relayErrCh: - c.Assert(errors.Cause(err), check.Equals, etcdErrCompacted) + t.Require().Equal(etcdErrCompacted, errors.Cause(err)) case <-time.After(300 * time.Millisecond): - c.Fatal("fail to get etcd error compacted") + t.T().Fatal("fail to get etcd error compacted") } // step 4: should stop the running relay because see deletion after compaction time.Sleep(time.Second) - c.Assert(utils.WaitSomething(30, 100*time.Millisecond, func() bool { + t.Require().True(utils.WaitSomething(30, 100*time.Millisecond, func() bool { return w.relayHolder.Stage() == pb.Stage_Stopped - }), check.IsTrue) + })) } -func (t *testServer) testSourceWorker(c *check.C) { - cfg := loadSourceConfigWithoutPassword(c) +func (t *testServer) testSourceWorker() { + cfg := loadSourceConfigWithoutPassword(t.T()) - dir := c.MkDir() + dir := t.T().TempDir() cfg.EnableRelay = true cfg.RelayDir = dir cfg.MetaDir = dir @@ -704,12 +705,12 @@ func (t *testServer) testSourceWorker(c *check.C) { masterAddr = tempurl.Alloc()[len("http://"):] keepAliveTTL = int64(1) ) - etcdDir := c.MkDir() + etcdDir := t.T().TempDir() ETCD, err := createMockETCD(etcdDir, "http://"+masterAddr) - c.Assert(err, check.IsNil) + t.Require().NoError(err) defer ETCD.Close() workerCfg := NewConfig() - c.Assert(workerCfg.Parse([]string{"-config=./dm-worker.toml"}), check.IsNil) + t.Require().NoError(workerCfg.Parse([]string{"-config=./dm-worker.toml"})) workerCfg.Join = masterAddr workerCfg.KeepAliveTTL = keepAliveTTL workerCfg.RelayKeepAliveTTL = keepAliveTTL @@ -720,66 +721,70 @@ func (t *testServer) testSourceWorker(c *check.C) { DialKeepAliveTime: keepaliveTime, DialKeepAliveTimeout: keepaliveTimeout, }) - c.Assert(err, check.IsNil) + t.Require().NoError(err) NewRelayHolder = NewDummyRelayHolderWithInitError defer func() { NewRelayHolder = NewRealRelayHolder }() w, err := NewSourceWorker(cfg, etcdCli, "", "") - c.Assert(err, check.IsNil) - c.Assert(failpoint.Enable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD", `return(true)`), check.IsNil) - c.Assert(w.EnableRelay(false), check.ErrorMatches, "init error") - c.Assert(failpoint.Disable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD"), check.IsNil) + t.Require().NoError(err) + t.Require().NoError(failpoint.Enable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD", `return(true)`)) + err = w.EnableRelay(false) + t.Require().Error(err) + t.Require().Regexp("init error", err.Error()) + t.Require().NoError(failpoint.Disable("github.com/pingcap/tiflow/dm/worker/MockGetSourceCfgFromETCD")) NewRelayHolder = NewDummyRelayHolder w, err = NewSourceWorker(cfg, etcdCli, "", "") - c.Assert(err, check.IsNil) - c.Assert(w.GetUnitAndSourceStatusJSON("", nil), check.HasLen, emptyWorkerStatusInfoJSONLength) + t.Require().NoError(err) + t.Require().Len(w.GetUnitAndSourceStatusJSON("", nil), emptyWorkerStatusInfoJSONLength) // stop twice w.Stop(true) - c.Assert(w.closed.Load(), check.IsTrue) - c.Assert(w.subTaskHolder.getAllSubTasks(), check.HasLen, 0) + t.Require().True(w.closed.Load()) + t.Require().Len(w.subTaskHolder.getAllSubTasks(), 0) w.Stop(true) - c.Assert(w.closed.Load(), check.IsTrue) - c.Assert(w.subTaskHolder.getAllSubTasks(), check.HasLen, 0) - c.Assert(w.closed.Load(), check.IsTrue) + t.Require().True(w.closed.Load()) + t.Require().Len(w.subTaskHolder.getAllSubTasks(), 0) + t.Require().True(w.closed.Load()) - c.Assert(w.StartSubTask(&config.SubTaskConfig{ + t.Require().NoError(w.StartSubTask(&config.SubTaskConfig{ Name: "testStartTask", - }, pb.Stage_Running, pb.Stage_Stopped, true), check.IsNil) + }, pb.Stage_Running, pb.Stage_Stopped, true)) task := w.subTaskHolder.findSubTask("testStartTask") - c.Assert(task, check.NotNil) - c.Assert(task.Result().String(), check.Matches, ".*worker already closed.*") + t.Require().NotNil(task) + t.Require().Regexp(".*worker already closed.*", task.Result().String()) - c.Assert(w.StartSubTask(&config.SubTaskConfig{ + t.Require().NoError(w.StartSubTask(&config.SubTaskConfig{ Name: "testStartTask-in-stopped", - }, pb.Stage_Stopped, pb.Stage_Stopped, true), check.IsNil) + }, pb.Stage_Stopped, pb.Stage_Stopped, true)) task = w.subTaskHolder.findSubTask("testStartTask-in-stopped") - c.Assert(task, check.NotNil) - c.Assert(task.Result().String(), check.Matches, ".*worker already closed.*") + t.Require().NotNil(task) + t.Require().Regexp(".*worker already closed.*", task.Result().String()) err = w.UpdateSubTask(context.Background(), &config.SubTaskConfig{ Name: "testStartTask", }, true) - c.Assert(err, check.ErrorMatches, ".*worker already closed.*") + t.Require().Error(err) + t.Require().Regexp(".*worker already closed.*", err.Error()) err = w.OperateSubTask("testSubTask", pb.TaskOp_Delete) - c.Assert(err, check.ErrorMatches, ".*worker already closed.*") + t.Require().Error(err) + t.Require().Regexp(".*worker already closed.*", err.Error()) } -func (t *testServer) TestQueryValidator(c *check.C) { - cfg := loadSourceConfigWithoutPassword(c) +func (t *testServer) TestQueryValidator() { + cfg := loadSourceConfigWithoutPassword(t.T()) - dir := c.MkDir() + dir := t.T().TempDir() cfg.EnableRelay = true cfg.RelayDir = dir cfg.MetaDir = dir w, err := NewSourceWorker(cfg, nil, "", "") w.closed.Store(false) - c.Assert(err, check.IsNil) + t.Require().NoError(err) st := NewSubTaskWithStage(&config.SubTaskConfig{ Name: "testQueryValidator", ValidatorCfg: config.ValidatorConfig{ @@ -789,14 +794,14 @@ func (t *testServer) TestQueryValidator(c *check.C) { w.subTaskHolder.recordSubTask(st) var ret *pb.ValidationStatus ret, err = w.GetValidatorStatus("invalidTaskName") - c.Assert(ret, check.IsNil) - c.Assert(terror.ErrWorkerSubTaskNotFound.Equal(err), check.IsTrue) + t.Require().Nil(ret) + t.Require().True(terror.ErrWorkerSubTaskNotFound.Equal(err)) } -func (t *testServer) setupValidator(c *check.C) *SourceWorker { - cfg := loadSourceConfigWithoutPassword(c) +func (t *testServer) setupValidator() *SourceWorker { + cfg := loadSourceConfigWithoutPassword(t.T()) - dir := c.MkDir() + dir := t.T().TempDir() cfg.EnableRelay = true cfg.RelayDir = dir cfg.MetaDir = dir @@ -810,25 +815,25 @@ func (t *testServer) setupValidator(c *check.C) *SourceWorker { st.StartValidator(pb.Stage_Running, false) w.subTaskHolder.recordSubTask(st) w.closed.Store(false) - c.Assert(err, check.IsNil) + t.Require().NoError(err) return w } -func (t *testServer) TestGetWorkerValidatorErr(c *check.C) { - w := t.setupValidator(c) +func (t *testServer) TestGetWorkerValidatorErr() { + w := t.setupValidator() // when subtask name not exists // return empty array errs, err := w.GetWorkerValidatorErr("invalidTask", pb.ValidateErrorState_InvalidErr) - c.Assert(terror.ErrWorkerSubTaskNotFound.Equal(err), check.IsTrue) - c.Assert(errs, check.IsNil) + t.Require().True(terror.ErrWorkerSubTaskNotFound.Equal(err)) + t.Require().Nil(errs) } -func (t *testServer) TestOperateWorkerValidatorErr(c *check.C) { - w := t.setupValidator(c) +func (t *testServer) TestOperateWorkerValidatorErr() { + w := t.setupValidator() // when subtask name not exists // return empty array taskNotFound := terror.ErrWorkerSubTaskNotFound.Generate("invalidTask") - c.Assert(w.OperateWorkerValidatorErr("invalidTask", pb.ValidationErrOp_ClearErrOp, 0, true).Error(), check.Equals, taskNotFound.Error()) + t.Require().Equal(taskNotFound.Error(), w.OperateWorkerValidatorErr("invalidTask", pb.ValidationErrOp_ClearErrOp, 0, true).Error()) } func TestMasterBinlogOff(t *testing.T) { diff --git a/dm/worker/subtask_test.go b/dm/worker/subtask_test.go index cc1f2e0ef5..1ded49153b 100644 --- a/dm/worker/subtask_test.go +++ b/dm/worker/subtask_test.go @@ -20,7 +20,6 @@ import ( "time" "github.com/go-mysql-org/go-mysql/mysql" - "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tiflow/dm/config" "github.com/pingcap/tiflow/dm/dumpling" @@ -42,41 +41,37 @@ const ( relayHolderBinlog = "(mysql-bin.00001,150)" ) -type testSubTask struct{} - -var _ = check.Suite(&testSubTask{}) - -func (t *testSubTask) TestCreateUnits(c *check.C) { +func TestCreateUnits(t *testing.T) { cfg := &config.SubTaskConfig{ Mode: "xxx", Flavor: mysql.MySQLFlavor, } worker := "worker" - c.Assert(createUnits(cfg, nil, worker, nil), check.HasLen, 0) + require.Len(t, createUnits(cfg, nil, worker, nil), 0) cfg.Mode = config.ModeFull unitsFull := createUnits(cfg, nil, worker, nil) - c.Assert(unitsFull, check.HasLen, 2) + require.Len(t, unitsFull, 2) _, ok := unitsFull[0].(*dumpling.Dumpling) - c.Assert(ok, check.IsTrue) + require.True(t, ok) _, ok = unitsFull[1].(*loader.LightningLoader) - c.Assert(ok, check.IsTrue) + require.True(t, ok) cfg.Mode = config.ModeIncrement unitsIncr := createUnits(cfg, nil, worker, nil) - c.Assert(unitsIncr, check.HasLen, 1) + require.Len(t, unitsIncr, 1) _, ok = unitsIncr[0].(*syncer.Syncer) - c.Assert(ok, check.IsTrue) + require.True(t, ok) cfg.Mode = config.ModeAll unitsAll := createUnits(cfg, nil, worker, nil) - c.Assert(unitsAll, check.HasLen, 3) + require.Len(t, unitsAll, 3) _, ok = unitsAll[0].(*dumpling.Dumpling) - c.Assert(ok, check.IsTrue) + require.True(t, ok) _, ok = unitsAll[1].(*loader.LightningLoader) - c.Assert(ok, check.IsTrue) + require.True(t, ok) _, ok = unitsAll[2].(*syncer.Syncer) - c.Assert(ok, check.IsTrue) + require.True(t, ok) } type MockUnit struct { @@ -217,14 +212,14 @@ func (u *KillOrderUnit) Type() pb.UnitType { return u.typ } func (u *KillOrderUnit) IsFreshTask(context.Context) (bool, error) { return true, nil } -func (t *testSubTask) TestSubTaskNormalUsage(c *check.C) { +func TestSubTaskNormalUsage(t *testing.T) { cfg := &config.SubTaskConfig{ Name: "testSubtaskScene", Mode: config.ModeFull, } st := NewSubTask(cfg, nil, "worker") - c.Assert(st.Stage(), check.DeepEquals, pb.Stage_New) + require.Equal(t, pb.Stage_New, st.Stage()) // test empty and fail defer func() { @@ -234,8 +229,8 @@ func (t *testSubTask) TestSubTaskNormalUsage(c *check.C) { return nil } st.Run(pb.Stage_Running, pb.Stage_Running, nil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Paused) - c.Assert(strings.Contains(st.Result().Errors[0].String(), "has no dm units for mode"), check.IsTrue) + require.Equal(t, pb.Stage_Paused, st.Stage()) + require.True(t, strings.Contains(st.Result().Errors[0].String(), "has no dm units for mode")) mockDumper := NewMockUnit(pb.UnitType_Dump) mockLoader := NewMockUnit(pb.UnitType_Load) @@ -244,24 +239,24 @@ func (t *testSubTask) TestSubTaskNormalUsage(c *check.C) { } st.Run(pb.Stage_Running, pb.Stage_Running, nil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Running) - c.Assert(st.CurrUnit(), check.Equals, mockDumper) - c.Assert(st.Result(), check.IsNil) + require.Equal(t, pb.Stage_Running, st.Stage()) + require.Equal(t, mockDumper, st.CurrUnit()) + require.Nil(t, st.Result()) // finish dump - c.Assert(mockDumper.InjectProcessError(context.Background(), nil), check.IsNil) + require.NoError(t, mockDumper.InjectProcessError(context.Background(), nil)) for i := 0; i < 10; i++ { if st.CurrUnit().Type() == pb.UnitType_Load { break } time.Sleep(time.Millisecond) } - c.Assert(st.CurrUnit(), check.Equals, mockLoader) - c.Assert(st.Result(), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Running) + require.Equal(t, mockLoader, st.CurrUnit()) + require.Nil(t, st.Result()) + require.Equal(t, pb.Stage_Running, st.Stage()) // fail loader - c.Assert(mockLoader.InjectProcessError(context.Background(), errors.New("loader process error")), check.IsNil) + require.NoError(t, mockLoader.InjectProcessError(context.Background(), errors.New("loader process error"))) for i := 0; i < 10; i++ { res := st.Result() if res != nil && st.Stage() == pb.Stage_Paused { @@ -269,74 +264,74 @@ func (t *testSubTask) TestSubTaskNormalUsage(c *check.C) { } time.Sleep(time.Millisecond) } - c.Assert(st.CurrUnit(), check.Equals, mockLoader) - c.Assert(st.Result(), check.NotNil) - c.Assert(st.Result().Errors, check.HasLen, 1) - c.Assert(strings.Contains(st.Result().Errors[0].Message, "loader process error"), check.IsTrue) - c.Assert(st.Stage(), check.Equals, pb.Stage_Paused) + require.Equal(t, mockLoader, st.CurrUnit()) + require.NotNil(t, st.Result()) + require.Len(t, st.Result().Errors, 1) + require.True(t, strings.Contains(st.Result().Errors[0].Message, "loader process error")) + require.Equal(t, pb.Stage_Paused, st.Stage()) // restore from pausing - c.Assert(st.Resume(nil), check.IsNil) - c.Assert(st.CurrUnit(), check.Equals, mockLoader) - c.Assert(st.Result(), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Running) + require.NoError(t, st.Resume(nil)) + require.Equal(t, mockLoader, st.CurrUnit()) + require.Nil(t, st.Result()) + require.Equal(t, pb.Stage_Running, st.Stage()) // update in running - c.Assert(st.Update(context.Background(), nil), check.NotNil) - c.Assert(st.CurrUnit(), check.Equals, mockLoader) - c.Assert(st.Result(), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Running) + require.NotNil(t, st.Update(context.Background(), nil)) + require.Equal(t, mockLoader, st.CurrUnit()) + require.Nil(t, st.Result()) + require.Equal(t, pb.Stage_Running, st.Stage()) // Pause - c.Assert(st.Pause(), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Paused) - c.Assert(st.CurrUnit(), check.Equals, mockLoader) + require.NoError(t, st.Pause()) + require.Equal(t, pb.Stage_Paused, st.Stage()) + require.Equal(t, mockLoader, st.CurrUnit()) if st.Result() != nil && (!st.Result().IsCanceled || len(st.Result().Errors) > 0) { - c.Fatalf("result %+v is not right after closing", st.Result()) + t.Fatalf("result %+v is not right after closing", st.Result()) } // update again - c.Assert(st.Update(context.Background(), &config.SubTaskConfig{Name: "updateSubtask"}), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Paused) - c.Assert(st.CurrUnit(), check.Equals, mockLoader) + require.NoError(t, st.Update(context.Background(), &config.SubTaskConfig{Name: "updateSubtask"})) + require.Equal(t, pb.Stage_Paused, st.Stage()) + require.Equal(t, mockLoader, st.CurrUnit()) if st.Result() != nil && (!st.Result().IsCanceled || len(st.Result().Errors) > 0) { - c.Fatalf("result %+v is not right after closing", st.Result()) + t.Fatalf("result %+v is not right after closing", st.Result()) } // run again - c.Assert(st.Resume(nil), check.IsNil) - c.Assert(st.CurrUnit(), check.Equals, mockLoader) - c.Assert(st.Result(), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Running) + require.NoError(t, st.Resume(nil)) + require.Equal(t, mockLoader, st.CurrUnit()) + require.Nil(t, st.Result()) + require.Equal(t, pb.Stage_Running, st.Stage()) // pause again - c.Assert(st.Pause(), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Paused) - c.Assert(st.CurrUnit(), check.Equals, mockLoader) + require.NoError(t, st.Pause()) + require.Equal(t, pb.Stage_Paused, st.Stage()) + require.Equal(t, mockLoader, st.CurrUnit()) if st.Result() != nil && (!st.Result().IsCanceled || len(st.Result().Errors) > 0) { - c.Fatalf("result %+v is not right after closing", st.Result()) + t.Fatalf("result %+v is not right after closing", st.Result()) } // run again - c.Assert(st.Resume(nil), check.IsNil) - c.Assert(st.CurrUnit(), check.Equals, mockLoader) - c.Assert(st.Result(), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Running) + require.NoError(t, st.Resume(nil)) + require.Equal(t, mockLoader, st.CurrUnit()) + require.Nil(t, st.Result()) + require.Equal(t, pb.Stage_Running, st.Stage()) // finish loader - c.Assert(mockLoader.InjectProcessError(context.Background(), nil), check.IsNil) + require.NoError(t, mockLoader.InjectProcessError(context.Background(), nil)) for i := 0; i < 1000; i++ { if st.Stage() == pb.Stage_Finished { break } time.Sleep(time.Millisecond) } - c.Assert(st.CurrUnit(), check.Equals, mockLoader) - c.Assert(st.Stage(), check.Equals, pb.Stage_Finished) - c.Assert(st.Result().Errors, check.HasLen, 0) + require.Equal(t, mockLoader, st.CurrUnit()) + require.Equal(t, pb.Stage_Finished, st.Stage()) + require.Len(t, st.Result().Errors, 0) } -func (t *testSubTask) TestKillWithCauseDoesNotCancelBeforeKill(c *check.C) { +func TestKillWithCauseDoesNotCancelBeforeKill(t *testing.T) { cfg := &config.SubTaskConfig{ Name: "testKillOrder", Mode: config.ModeIncrement, @@ -356,17 +351,17 @@ func (t *testSubTask) TestKillWithCauseDoesNotCancelBeforeKill(c *check.C) { <-u.started st.killWithCause(errors.New("test")) - c.Assert(u.canceledAtKill, check.IsFalse) + require.False(t, u.canceledAtKill) } -func (t *testSubTask) TestPauseAndResumeSubtask(c *check.C) { +func TestPauseAndResumeSubtask(t *testing.T) { cfg := &config.SubTaskConfig{ Name: "testSubtaskScene", Mode: config.ModeFull, } st := NewSubTask(cfg, nil, "worker") - c.Assert(st.Stage(), check.DeepEquals, pb.Stage_New) + require.Equal(t, pb.Stage_New, st.Stage()) mockDumper := NewMockUnit(pb.UnitType_Dump) mockLoader := NewMockUnit(pb.UnitType_Load) @@ -378,110 +373,110 @@ func (t *testSubTask) TestPauseAndResumeSubtask(c *check.C) { } st.Run(pb.Stage_Running, pb.Stage_Running, nil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Running) - c.Assert(st.CurrUnit(), check.Equals, mockDumper) - c.Assert(st.Result(), check.IsNil) - c.Assert(st.CheckUnit(), check.IsFalse) + require.Equal(t, pb.Stage_Running, st.Stage()) + require.Equal(t, mockDumper, st.CurrUnit()) + require.Nil(t, st.Result()) + require.False(t, st.CheckUnit()) // pause twice - c.Assert(st.Pause(), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Paused) - c.Assert(st.CurrUnit(), check.Equals, mockDumper) + require.NoError(t, st.Pause()) + require.Equal(t, pb.Stage_Paused, st.Stage()) + require.Equal(t, mockDumper, st.CurrUnit()) if st.Result() != nil && (!st.Result().IsCanceled || len(st.Result().Errors) > 0) { - c.Fatalf("result %+v is not right after closing", st.Result()) + t.Fatalf("result %+v is not right after closing", st.Result()) } - c.Assert(st.Pause(), check.NotNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Paused) - c.Assert(st.CurrUnit(), check.Equals, mockDumper) + require.NotNil(t, st.Pause()) + require.Equal(t, pb.Stage_Paused, st.Stage()) + require.Equal(t, mockDumper, st.CurrUnit()) if st.Result() != nil && (!st.Result().IsCanceled || len(st.Result().Errors) > 0) { - c.Fatalf("result %+v is not right after closing", st.Result()) + t.Fatalf("result %+v is not right after closing", st.Result()) } // resume - c.Assert(st.Resume(nil), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Running) - c.Assert(st.CurrUnit(), check.Equals, mockDumper) - c.Assert(st.Result(), check.IsNil) - - c.Assert(st.Pause(), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Paused) - c.Assert(st.CurrUnit(), check.Equals, mockDumper) + require.NoError(t, st.Resume(nil)) + require.Equal(t, pb.Stage_Running, st.Stage()) + require.Equal(t, mockDumper, st.CurrUnit()) + require.Nil(t, st.Result()) + + require.NoError(t, st.Pause()) + require.Equal(t, pb.Stage_Paused, st.Stage()) + require.Equal(t, mockDumper, st.CurrUnit()) if st.Result() != nil && (!st.Result().IsCanceled || len(st.Result().Errors) > 0) { - c.Fatalf("result %+v is not right after closing", st.Result()) + t.Fatalf("result %+v is not right after closing", st.Result()) } // resume - c.Assert(st.Resume(nil), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Running) - c.Assert(st.CurrUnit(), check.Equals, mockDumper) - c.Assert(st.Result(), check.IsNil) + require.NoError(t, st.Resume(nil)) + require.Equal(t, pb.Stage_Running, st.Stage()) + require.Equal(t, mockDumper, st.CurrUnit()) + require.Nil(t, st.Result()) // fail dumper - c.Assert(mockDumper.InjectProcessError(context.Background(), errors.New("dumper process error")), check.IsNil) + require.NoError(t, mockDumper.InjectProcessError(context.Background(), errors.New("dumper process error"))) // InjectProcessError need 1 second, here we wait 1.5 second utils.WaitSomething(15, 100*time.Millisecond, func() bool { return st.Result() != nil }) - c.Assert(st.CurrUnit(), check.Equals, mockDumper) - c.Assert(st.Result(), check.NotNil) - c.Assert(st.Result().Errors, check.HasLen, 1) - c.Assert(strings.Contains(st.Result().Errors[0].Message, "dumper process error"), check.IsTrue) - c.Assert(st.Stage(), check.Equals, pb.Stage_Paused) + require.Equal(t, mockDumper, st.CurrUnit()) + require.NotNil(t, st.Result()) + require.Len(t, st.Result().Errors, 1) + require.True(t, strings.Contains(st.Result().Errors[0].Message, "dumper process error")) + require.Equal(t, pb.Stage_Paused, st.Stage()) // pause - c.Assert(st.Pause(), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Paused) - c.Assert(st.CurrUnit(), check.Equals, mockDumper) - c.Assert(st.Result(), check.NotNil) - c.Assert(st.Result().Errors, check.HasLen, 1) - c.Assert(st.Result().IsCanceled, check.IsTrue) - c.Assert(strings.Contains(st.Result().Errors[0].Message, "dumper process error"), check.IsTrue) + require.NoError(t, st.Pause()) + require.Equal(t, pb.Stage_Paused, st.Stage()) + require.Equal(t, mockDumper, st.CurrUnit()) + require.NotNil(t, st.Result()) + require.Len(t, st.Result().Errors, 1) + require.True(t, st.Result().IsCanceled) + require.True(t, strings.Contains(st.Result().Errors[0].Message, "dumper process error")) // resume twice - c.Assert(st.Resume(nil), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Running) - c.Assert(st.CurrUnit(), check.Equals, mockDumper) - c.Assert(st.Result(), check.IsNil) - - c.Assert(st.Resume(nil), check.NotNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Running) - c.Assert(st.CurrUnit(), check.Equals, mockDumper) - c.Assert(st.Result(), check.IsNil) + require.NoError(t, st.Resume(nil)) + require.Equal(t, pb.Stage_Running, st.Stage()) + require.Equal(t, mockDumper, st.CurrUnit()) + require.Nil(t, st.Result()) + + require.NotNil(t, st.Resume(nil)) + require.Equal(t, pb.Stage_Running, st.Stage()) + require.Equal(t, mockDumper, st.CurrUnit()) + require.Nil(t, st.Result()) // finish dump - c.Assert(mockDumper.InjectProcessError(context.Background(), nil), check.IsNil) + require.NoError(t, mockDumper.InjectProcessError(context.Background(), nil)) utils.WaitSomething(20, 50*time.Millisecond, func() bool { return st.CurrUnit().Type() == pb.UnitType_Load }) - c.Assert(st.CurrUnit(), check.Equals, mockLoader) - c.Assert(st.Result(), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Running) + require.Equal(t, mockLoader, st.CurrUnit()) + require.Nil(t, st.Result()) + require.Equal(t, pb.Stage_Running, st.Stage()) // finish loader - c.Assert(mockLoader.InjectProcessError(context.Background(), nil), check.IsNil) + require.NoError(t, mockLoader.InjectProcessError(context.Background(), nil)) utils.WaitSomething(20, 50*time.Millisecond, func() bool { return st.Stage() == pb.Stage_Finished }) - c.Assert(st.CurrUnit(), check.Equals, mockLoader) - c.Assert(st.Stage(), check.Equals, pb.Stage_Finished) - c.Assert(st.Result().Errors, check.HasLen, 0) + require.Equal(t, mockLoader, st.CurrUnit()) + require.Equal(t, pb.Stage_Finished, st.Stage()) + require.Len(t, st.Result().Errors, 0) st.Run(pb.Stage_Finished, pb.Stage_Stopped, nil) - c.Assert(st.CurrUnit(), check.Equals, mockLoader) - c.Assert(st.Stage(), check.Equals, pb.Stage_Finished) - c.Assert(st.Result().Errors, check.HasLen, 0) + require.Equal(t, mockLoader, st.CurrUnit()) + require.Equal(t, pb.Stage_Finished, st.Stage()) + require.Len(t, st.Result().Errors, 0) } -func (t *testSubTask) TestSubtaskWithStage(c *check.C) { +func TestSubtaskWithStage(t *testing.T) { cfg := &config.SubTaskConfig{ SourceID: "source", Name: "testSubtaskScene", Mode: config.ModeFull, } - c.Assert(cfg.Adjust(false), check.IsNil) + require.NoError(t, cfg.Adjust(false)) st := NewSubTaskWithStage(cfg, pb.Stage_Paused, nil, "worker") - c.Assert(st.Stage(), check.DeepEquals, pb.Stage_Paused) + require.Equal(t, pb.Stage_Paused, st.Stage()) mockDumper := NewMockUnit(pb.UnitType_Dump) mockLoader := NewMockUnit(pb.UnitType_Load) @@ -493,37 +488,37 @@ func (t *testSubTask) TestSubtaskWithStage(c *check.C) { } // pause - c.Assert(st.Pause(), check.NotNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Paused) - c.Assert(st.CurrUnit(), check.Equals, nil) - c.Assert(st.Result(), check.IsNil) + require.NotNil(t, st.Pause()) + require.Equal(t, pb.Stage_Paused, st.Stage()) + require.Equal(t, nil, st.CurrUnit()) + require.Nil(t, st.Result()) - c.Assert(st.Resume(nil), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Running) - c.Assert(st.CurrUnit(), check.Equals, mockDumper) - c.Assert(st.Result(), check.IsNil) + require.NoError(t, st.Resume(nil)) + require.Equal(t, pb.Stage_Running, st.Stage()) + require.Equal(t, mockDumper, st.CurrUnit()) + require.Nil(t, st.Result()) // pause again - c.Assert(st.Pause(), check.IsNil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Paused) - c.Assert(st.CurrUnit(), check.Equals, mockDumper) + require.NoError(t, st.Pause()) + require.Equal(t, pb.Stage_Paused, st.Stage()) + require.Equal(t, mockDumper, st.CurrUnit()) if st.Result() != nil && (!st.Result().IsCanceled || len(st.Result().Errors) > 0) { - c.Fatalf("result %+v is not right after closing", st.Result()) + t.Fatalf("result %+v is not right after closing", st.Result()) } st = NewSubTaskWithStage(cfg, pb.Stage_Finished, nil, "worker") - c.Assert(st.Stage(), check.DeepEquals, pb.Stage_Finished) + require.Equal(t, pb.Stage_Finished, st.Stage()) createUnits = func(cfg *config.SubTaskConfig, etcdClient *clientv3.Client, worker string, relay relay.Process) []unit.Unit { return []unit.Unit{mockDumper, mockLoader} } st.Run(pb.Stage_Finished, pb.Stage_Stopped, nil) - c.Assert(st.Stage(), check.Equals, pb.Stage_Finished) - c.Assert(st.CurrUnit(), check.Equals, nil) - c.Assert(st.Result(), check.IsNil) + require.Equal(t, pb.Stage_Finished, st.Stage()) + require.Equal(t, nil, st.CurrUnit()) + require.Nil(t, st.Result()) } -func (t *testSubTask) TestSubtaskFastQuit(c *check.C) { +func TestSubtaskFastQuit(t *testing.T) { // case: test subtask stuck into unitTransWaitCondition cfg := &config.SubTaskConfig{ Name: "testSubtaskFastQuit", @@ -555,14 +550,14 @@ func (t *testSubTask) TestSubtaskFastQuit(c *check.C) { // test Pause time.Sleep(time.Second) // wait for task to run for some time - c.Assert(st.Stage(), check.Equals, pb.Stage_Running) - c.Assert(st.Pause(), check.IsNil) + require.Equal(t, pb.Stage_Running, st.Stage()) + require.NoError(t, st.Pause()) select { case <-time.After(500 * time.Millisecond): - c.Fatal("fail to pause subtask in 0.5s when stuck into unitTransWaitCondition") + t.Fatal("fail to pause subtask in 0.5s when stuck into unitTransWaitCondition") case <-finished: } - c.Assert(st.Stage(), check.Equals, pb.Stage_Paused) + require.Equal(t, pb.Stage_Paused, st.Stage()) st = NewSubTaskWithStage(cfg, pb.Stage_Paused, nil, "worker") st.units = []unit.Unit{mockLoader, mockSyncer} @@ -575,17 +570,17 @@ func (t *testSubTask) TestSubtaskFastQuit(c *check.C) { close(finished) }() - c.Assert(utils.WaitSomething(10, 100*time.Millisecond, func() bool { + require.True(t, utils.WaitSomething(10, 100*time.Millisecond, func() bool { return st.Stage() == pb.Stage_Running - }), check.IsTrue) + })) // test Close st.Close() select { case <-time.After(500 * time.Millisecond): - c.Fatal("fail to stop subtask in 0.5s when stuck into unitTransWaitCondition") + t.Fatal("fail to stop subtask in 0.5s when stuck into unitTransWaitCondition") case <-finished: } - c.Assert(st.Stage(), check.Equals, pb.Stage_Stopped) + require.Equal(t, pb.Stage_Stopped, st.Stage()) } func TestGetValidatorError(t *testing.T) { diff --git a/go.mod b/go.mod index db366fb4ba..1319cb5cda 100644 --- a/go.mod +++ b/go.mod @@ -69,7 +69,6 @@ require ( github.com/olekukonko/tablewriter v0.0.5 github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 github.com/pierrec/lz4/v4 v4.1.26 - github.com/pingcap/check v0.0.0-20211026125417-57bd13f7b5f0 github.com/pingcap/errors v0.11.5-0.20260508054701-306e305bcf41 github.com/pingcap/failpoint v0.0.0-20240528011301-b51a646c7c86 github.com/pingcap/kvproto v0.0.0-20260601035955-b2b3bb492278 diff --git a/go.sum b/go.sum index 430e8295f2..dbd7960202 100644 --- a/go.sum +++ b/go.sum @@ -873,9 +873,6 @@ github.com/pierrec/lz4/v4 v4.1.26 h1:GrpZw1gZttORinvzBdXPUXATeqlJjqUG/D87TKMnhjY github.com/pierrec/lz4/v4 v4.1.26/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4= github.com/pingcap/badger v1.5.1-0.20241015064302-38533b6cbf8d h1:eHcokyHxm7HVM+7+Qy1zZwC7NhX9wVNX8oQDcSZw1qI= github.com/pingcap/badger v1.5.1-0.20241015064302-38533b6cbf8d/go.mod h1:KiO2zumBCWx7yoVYoFRpb+DNrwEPk1pR1LF7NvOACMQ= -github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= -github.com/pingcap/check v0.0.0-20211026125417-57bd13f7b5f0 h1:HVl5539r48eA+uDuX/ziBmQCxzT1pGrzWbKuXT46Bq0= -github.com/pingcap/check v0.0.0-20211026125417-57bd13f7b5f0/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= @@ -890,7 +887,6 @@ github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989/go.mod h1:O17Xtb github.com/pingcap/kvproto v0.0.0-20191211054548-3c6b38ea5107/go.mod h1:WWLmULLO7l8IOcQG+t+ItJ3fEcrL5FxF0Wu+HrMy26w= github.com/pingcap/kvproto v0.0.0-20260601035955-b2b3bb492278 h1:VV03wSSG2XhOwhF79lvT88Z83lwzMT+aZHXrcCIN9B0= github.com/pingcap/kvproto v0.0.0-20260601035955-b2b3bb492278/go.mod h1:z6+aAHB7dBkA+LyinEX+48/ImRJ3jag0Hg0c7wkhEvE= -github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= github.com/pingcap/log v0.0.0-20210625125904-98ed8e2eb1c7/go.mod h1:8AanEdAHATuRurdGxZXBz0At+9avep+ub7U1AGYLIMM= github.com/pingcap/log v1.1.0/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= github.com/pingcap/log v1.1.1-0.20250917021125-19901e015dc9 h1:qG9BSvlWFEE5otQGamuWedx9LRm0nrHvsQRQiW8SxEs= @@ -1481,7 +1477,6 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191107010934-f79515f33823/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= diff --git a/pkg/diff/checkpoint_test.go b/pkg/diff/checkpoint_test.go index babf9fd9a8..95b584a097 100644 --- a/pkg/diff/checkpoint_test.go +++ b/pkg/diff/checkpoint_test.go @@ -15,41 +15,38 @@ package diff import ( "context" + "testing" sqlmock "github.com/DATA-DOG/go-sqlmock" - "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testCheckpointSuite{}) - -type testCheckpointSuite struct{} - -func (s *testUtilSuite) TestloadFromCheckPoint(c *check.C) { +func TestLoadFromCheckPoint(t *testing.T) { db, mock, err := sqlmock.New() - c.Assert(err, check.IsNil) + require.NoError(t, err) rows := sqlmock.NewRows([]string{"state", "config_hash"}).AddRow("success", "123") mock.ExpectQuery("SELECT").WillReturnRows(rows) useCheckpoint, err := loadFromCheckPoint(context.Background(), db, "test", "test", "123") - c.Assert(err, check.IsNil) - c.Assert(useCheckpoint, check.Equals, false) + require.NoError(t, err) + require.Equal(t, false, useCheckpoint) rows = sqlmock.NewRows([]string{"state", "config_hash"}).AddRow("success", "123") mock.ExpectQuery("SELECT").WillReturnRows(rows) useCheckpoint, err = loadFromCheckPoint(context.Background(), db, "test", "test", "456") - c.Assert(err, check.IsNil) - c.Assert(useCheckpoint, check.Equals, false) + require.NoError(t, err) + require.Equal(t, false, useCheckpoint) rows = sqlmock.NewRows([]string{"state", "config_hash"}).AddRow("failed", "123") mock.ExpectQuery("SELECT").WillReturnRows(rows) useCheckpoint, err = loadFromCheckPoint(context.Background(), db, "test", "test", "123") - c.Assert(err, check.IsNil) - c.Assert(useCheckpoint, check.Equals, true) + require.NoError(t, err) + require.Equal(t, true, useCheckpoint) } -func (s *testUtilSuite) TestInitChunks(c *check.C) { +func TestInitChunks(t *testing.T) { db, _, err := sqlmock.New() - c.Assert(err, check.IsNil) + require.NoError(t, err) chunks := []*ChunkRange{ { @@ -69,5 +66,6 @@ func (s *testUtilSuite) TestInitChunks(c *check.C) { // so just skip the `ExpectQuery` and check the error message // mock.ExpectQuery("INSERT INTO `sync_diff_inspector`.`chunk` VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?), (?, ?, ?, ?, ?, ?, ?, ?, ?)").WithArgs(......) err = initChunks(context.Background(), db, "target", "diff_test", "test", chunks) - c.Assert(err, check.ErrorMatches, ".*INSERT INTO `sync_diff_inspector`.`chunk` VALUES\\(\\?, \\?, \\?, \\?, \\?, \\?, \\?, \\?, \\?\\), \\(\\?, \\?, \\?, \\?, \\?, \\?, \\?, \\?, \\?\\).*") + require.Error(t, err) + require.Regexp(t, ".*INSERT INTO `sync_diff_inspector`.`chunk` VALUES\\(\\?, \\?, \\?, \\?, \\?, \\?, \\?, \\?, \\?\\), \\(\\?, \\?, \\?, \\?, \\?, \\?, \\?, \\?, \\?\\).*", err.Error()) } diff --git a/pkg/diff/chunk_test.go b/pkg/diff/chunk_test.go index dff91bf309..aa4ffb66f3 100644 --- a/pkg/diff/chunk_test.go +++ b/pkg/diff/chunk_test.go @@ -14,14 +14,12 @@ package diff import ( - "github.com/pingcap/check" -) - -var _ = check.Suite(&testChunkSuite{}) + "testing" -type testChunkSuite struct{} + "github.com/stretchr/testify/require" +) -func (*testChunkSuite) TestChunkUpdate(c *check.C) { +func TestChunkUpdate(t *testing.T) { chunk := &ChunkRange{ Bounds: []*Bound{ { @@ -63,18 +61,18 @@ func (*testChunkSuite) TestChunkUpdate(c *check.C) { for _, cs := range testCases { newChunk := chunk.copyAndUpdate(cs.boundArgs[0], cs.boundArgs[1], cs.boundArgs[2]) conditions, args := newChunk.toString("") - c.Assert(conditions, check.Equals, cs.expectStr) - c.Assert(args, check.DeepEquals, cs.expectArgs) + require.Equal(t, cs.expectStr, conditions) + require.Equal(t, cs.expectArgs, args) } // the origin chunk is not changed conditions, args := chunk.toString("") - c.Assert(conditions, check.Equals, "((`a` > ?) OR (`a` = ? AND `b` > ?)) AND ((`a` < ?) OR (`a` = ? AND `b` <= ?))") + require.Equal(t, "((`a` > ?) OR (`a` = ? AND `b` > ?)) AND ((`a` < ?) OR (`a` = ? AND `b` <= ?))", conditions) expectArgs := []string{"1", "1", "3", "2", "2", "4"} - c.Assert(args, check.DeepEquals, expectArgs) + require.Equal(t, expectArgs, args) } -func (*testChunkSuite) TestChunkToString(c *check.C) { +func TestChunkToString(t *testing.T) { chunk := &ChunkRange{ Bounds: []*Bound{ { @@ -100,16 +98,16 @@ func (*testChunkSuite) TestChunkToString(c *check.C) { } conditions, args := chunk.toString("") - c.Assert(conditions, check.Equals, "((`a` > ?) OR (`a` = ? AND `b` > ?) OR (`a` = ? AND `b` = ? AND `c` > ?)) AND ((`a` < ?) OR (`a` = ? AND `b` < ?) OR (`a` = ? AND `b` = ? AND `c` <= ?))") + require.Equal(t, "((`a` > ?) OR (`a` = ? AND `b` > ?) OR (`a` = ? AND `b` = ? AND `c` > ?)) AND ((`a` < ?) OR (`a` = ? AND `b` < ?) OR (`a` = ? AND `b` = ? AND `c` <= ?))", conditions) expectArgs := []string{"1", "1", "3", "1", "3", "5", "2", "2", "4", "2", "4", "6"} for i, arg := range args { - c.Assert(arg, check.Equals, expectArgs[i]) + require.Equal(t, expectArgs[i], arg) } conditions, args = chunk.toString("latin1") - c.Assert(conditions, check.Equals, "((`a` COLLATE 'latin1' > ?) OR (`a` = ? AND `b` COLLATE 'latin1' > ?) OR (`a` = ? AND `b` = ? AND `c` COLLATE 'latin1' > ?)) AND ((`a` COLLATE 'latin1' < ?) OR (`a` = ? AND `b` COLLATE 'latin1' < ?) OR (`a` = ? AND `b` = ? AND `c` COLLATE 'latin1' <= ?))") + require.Equal(t, "((`a` COLLATE 'latin1' > ?) OR (`a` = ? AND `b` COLLATE 'latin1' > ?) OR (`a` = ? AND `b` = ? AND `c` COLLATE 'latin1' > ?)) AND ((`a` COLLATE 'latin1' < ?) OR (`a` = ? AND `b` COLLATE 'latin1' < ?) OR (`a` = ? AND `b` = ? AND `c` COLLATE 'latin1' <= ?))", conditions) expectArgs = []string{"1", "1", "3", "1", "3", "5", "2", "2", "4", "2", "4", "6"} for i, arg := range args { - c.Assert(arg, check.Equals, expectArgs[i]) + require.Equal(t, expectArgs[i], arg) } } diff --git a/pkg/diff/diff_test.go b/pkg/diff/diff_test.go index ed858ba1ea..4ad3f4df29 100644 --- a/pkg/diff/diff_test.go +++ b/pkg/diff/diff_test.go @@ -17,24 +17,16 @@ import ( "testing" _ "github.com/go-sql-driver/mysql" - "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/util/dbutil" "github.com/pingcap/tidb/pkg/util/dbutil/dbutiltest" + "github.com/stretchr/testify/require" ) -func TestClient(t *testing.T) { - check.TestingT(t) -} - -var _ = check.Suite(&testDiffSuite{}) - -type testDiffSuite struct{} - -func (*testDiffSuite) TestGenerateSQLs(c *check.C) { +func TestGenerateSQLs(t *testing.T) { createTableSQL := "CREATE TABLE `diff_test`.`atest` (`id` int(24), `name` varchar(24), `birthday` datetime, `update_time` time, `money` decimal(20,2), `id_gen` int(11) GENERATED ALWAYS AS ((`id` + 1)) VIRTUAL, primary key(`id`, `name`))" tableInfo, err := dbutiltest.GetTableInfoBySQL(createTableSQL, parser.New()) - c.Assert(err, check.IsNil) + require.NoError(t, err) rowsData := map[string]*dbutil.ColumnData{ "id": {Data: []byte("1"), IsNull: false}, @@ -47,40 +39,40 @@ func (*testDiffSuite) TestGenerateSQLs(c *check.C) { replaceSQL := generateDML("replace", rowsData, tableInfo, "diff_test") deleteSQL := generateDML("delete", rowsData, tableInfo, "diff_test") - c.Assert(replaceSQL, check.Equals, "REPLACE INTO `diff_test`.`atest`(`id`,`name`,`birthday`,`update_time`,`money`) VALUES (1,'xxx','2018-01-01 00:00:00','10:10:10',11.1111);") - c.Assert(deleteSQL, check.Equals, "DELETE FROM `diff_test`.`atest` WHERE `id` = 1 AND `name` = 'xxx' AND `birthday` = '2018-01-01 00:00:00' AND `update_time` = '10:10:10' AND `money` = 11.1111;") + require.Equal(t, "REPLACE INTO `diff_test`.`atest`(`id`,`name`,`birthday`,`update_time`,`money`) VALUES (1,'xxx','2018-01-01 00:00:00','10:10:10',11.1111);", replaceSQL) + require.Equal(t, "DELETE FROM `diff_test`.`atest` WHERE `id` = 1 AND `name` = 'xxx' AND `birthday` = '2018-01-01 00:00:00' AND `update_time` = '10:10:10' AND `money` = 11.1111;", deleteSQL) // test the unique key createTableSQL2 := "CREATE TABLE `diff_test`.`atest` (`id` int(24), `name` varchar(24), `birthday` datetime, `update_time` time, `money` decimal(20,2), unique key(`id`, `name`))" tableInfo2, err := dbutiltest.GetTableInfoBySQL(createTableSQL2, parser.New()) - c.Assert(err, check.IsNil) + require.NoError(t, err) replaceSQL = generateDML("replace", rowsData, tableInfo2, "diff_test") deleteSQL = generateDML("delete", rowsData, tableInfo2, "diff_test") - c.Assert(replaceSQL, check.Equals, "REPLACE INTO `diff_test`.`atest`(`id`,`name`,`birthday`,`update_time`,`money`) VALUES (1,'xxx','2018-01-01 00:00:00','10:10:10',11.1111);") - c.Assert(deleteSQL, check.Equals, "DELETE FROM `diff_test`.`atest` WHERE `id` = 1 AND `name` = 'xxx' AND `birthday` = '2018-01-01 00:00:00' AND `update_time` = '10:10:10' AND `money` = 11.1111;") + require.Equal(t, "REPLACE INTO `diff_test`.`atest`(`id`,`name`,`birthday`,`update_time`,`money`) VALUES (1,'xxx','2018-01-01 00:00:00','10:10:10',11.1111);", replaceSQL) + require.Equal(t, "DELETE FROM `diff_test`.`atest` WHERE `id` = 1 AND `name` = 'xxx' AND `birthday` = '2018-01-01 00:00:00' AND `update_time` = '10:10:10' AND `money` = 11.1111;", deleteSQL) // test value is nil rowsData["name"] = &dbutil.ColumnData{Data: []byte(""), IsNull: true} replaceSQL = generateDML("replace", rowsData, tableInfo, "diff_test") deleteSQL = generateDML("delete", rowsData, tableInfo, "diff_test") - c.Assert(replaceSQL, check.Equals, "REPLACE INTO `diff_test`.`atest`(`id`,`name`,`birthday`,`update_time`,`money`) VALUES (1,NULL,'2018-01-01 00:00:00','10:10:10',11.1111);") - c.Assert(deleteSQL, check.Equals, "DELETE FROM `diff_test`.`atest` WHERE `id` = 1 AND `name` is NULL AND `birthday` = '2018-01-01 00:00:00' AND `update_time` = '10:10:10' AND `money` = 11.1111;") + require.Equal(t, "REPLACE INTO `diff_test`.`atest`(`id`,`name`,`birthday`,`update_time`,`money`) VALUES (1,NULL,'2018-01-01 00:00:00','10:10:10',11.1111);", replaceSQL) + require.Equal(t, "DELETE FROM `diff_test`.`atest` WHERE `id` = 1 AND `name` is NULL AND `birthday` = '2018-01-01 00:00:00' AND `update_time` = '10:10:10' AND `money` = 11.1111;", deleteSQL) rowsData["id"] = &dbutil.ColumnData{Data: []byte(""), IsNull: true} replaceSQL = generateDML("replace", rowsData, tableInfo, "diff_test") deleteSQL = generateDML("delete", rowsData, tableInfo, "diff_test") - c.Assert(replaceSQL, check.Equals, "REPLACE INTO `diff_test`.`atest`(`id`,`name`,`birthday`,`update_time`,`money`) VALUES (NULL,NULL,'2018-01-01 00:00:00','10:10:10',11.1111);") - c.Assert(deleteSQL, check.Equals, "DELETE FROM `diff_test`.`atest` WHERE `id` is NULL AND `name` is NULL AND `birthday` = '2018-01-01 00:00:00' AND `update_time` = '10:10:10' AND `money` = 11.1111;") + require.Equal(t, "REPLACE INTO `diff_test`.`atest`(`id`,`name`,`birthday`,`update_time`,`money`) VALUES (NULL,NULL,'2018-01-01 00:00:00','10:10:10',11.1111);", replaceSQL) + require.Equal(t, "DELETE FROM `diff_test`.`atest` WHERE `id` is NULL AND `name` is NULL AND `birthday` = '2018-01-01 00:00:00' AND `update_time` = '10:10:10' AND `money` = 11.1111;", deleteSQL) // test value with "'" rowsData["name"] = &dbutil.ColumnData{Data: []byte("a'a"), IsNull: false} replaceSQL = generateDML("replace", rowsData, tableInfo, "diff_test") deleteSQL = generateDML("delete", rowsData, tableInfo, "diff_test") - c.Assert(replaceSQL, check.Equals, "REPLACE INTO `diff_test`.`atest`(`id`,`name`,`birthday`,`update_time`,`money`) VALUES (NULL,'a\\'a','2018-01-01 00:00:00','10:10:10',11.1111);") - c.Assert(deleteSQL, check.Equals, "DELETE FROM `diff_test`.`atest` WHERE `id` is NULL AND `name` = 'a\\'a' AND `birthday` = '2018-01-01 00:00:00' AND `update_time` = '10:10:10' AND `money` = 11.1111;") + require.Equal(t, "REPLACE INTO `diff_test`.`atest`(`id`,`name`,`birthday`,`update_time`,`money`) VALUES (NULL,'a\\'a','2018-01-01 00:00:00','10:10:10',11.1111);", replaceSQL) + require.Equal(t, "DELETE FROM `diff_test`.`atest` WHERE `id` is NULL AND `name` = 'a\\'a' AND `birthday` = '2018-01-01 00:00:00' AND `update_time` = '10:10:10' AND `money` = 11.1111;", deleteSQL) } -func (*testDiffSuite) TestConfigHash(c *check.C) { +func TestConfigHash(t *testing.T) { tbDiff := &TableDiff{ Range: "a > 1", ChunkSize: 1000, @@ -91,10 +83,10 @@ func (*testDiffSuite) TestConfigHash(c *check.C) { tbDiff.CheckThreadCount = 10 tbDiff.setConfigHash() hash2 := tbDiff.configHash - c.Assert(hash1, check.Equals, hash2) + require.Equal(t, hash2, hash1) tbDiff.Range = "b < 10" tbDiff.setConfigHash() hash3 := tbDiff.configHash - c.Assert(hash1 == hash3, check.Equals, false) + require.Equal(t, false, hash1 == hash3) } diff --git a/pkg/diff/merge_test.go b/pkg/diff/merge_test.go index ca08055c53..33e9270d56 100644 --- a/pkg/diff/merge_test.go +++ b/pkg/diff/merge_test.go @@ -15,21 +15,18 @@ package diff import ( "container/heap" + "testing" - "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/util/dbutil" "github.com/pingcap/tidb/pkg/util/dbutil/dbutiltest" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testMergerSuite{}) - -type testMergerSuite struct{} - -func (s *testMergerSuite) TestMerge(c *check.C) { +func TestMerge(t *testing.T) { createTableSQL := "create table test.test(id int(24), name varchar(24), age int(24), primary key(id, name));" tableInfo, err := dbutiltest.GetTableInfoBySQL(createTableSQL, parser.New()) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, orderKeyCols := dbutil.SelectUniqueOrderKey(tableInfo) ids := []string{"3", "2", "2", "4", "1", "NULL"} @@ -60,7 +57,7 @@ func (s *testMergerSuite) TestMerge(c *check.C) { rowData := heap.Pop(rowDatas).(RowData) id := string(rowData.Data["id"].Data) name := string(rowData.Data["name"].Data) - c.Assert(id, check.Equals, expectIDs[i]) - c.Assert(name, check.Equals, expectNames[i]) + require.Equal(t, expectIDs[i], id) + require.Equal(t, expectNames[i], name) } } diff --git a/pkg/diff/spliter_test.go b/pkg/diff/spliter_test.go index 77026ace56..490d808c9b 100644 --- a/pkg/diff/spliter_test.go +++ b/pkg/diff/spliter_test.go @@ -15,28 +15,25 @@ package diff import ( "fmt" + "testing" "time" sqlmock "github.com/DATA-DOG/go-sqlmock" - "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/parser" ttypes "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/codec" "github.com/pingcap/tidb/pkg/util/dbutil/dbutiltest" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testSpliterSuite{}) - -type testSpliterSuite struct{} - type chunkResult struct { chunkStr string args []string } -func (s *testSpliterSuite) TestSplitRangeByRandom(c *check.C) { +func TestSplitRangeByRandom(t *testing.T) { db, mock, err := sqlmock.New() - c.Assert(err, check.IsNil) + require.NoError(t, err) testCases := []struct { createTableSQL string @@ -118,26 +115,26 @@ func (s *testSpliterSuite) TestSplitRangeByRandom(c *check.C) { for i, testCase := range testCases { tableInfo, err := dbutiltest.GetTableInfoBySQL(testCase.createTableSQL, parser.New()) - c.Assert(err, check.IsNil) + require.NoError(t, err) splitCols, err := getSplitFields(tableInfo, nil) - c.Assert(err, check.IsNil) + require.NoError(t, err) createFakeResultForRandomSplit(mock, 0, testCase.randomValues) chunks, err := splitRangeByRandom(db, testCase.originChunk, testCase.splitCount, "test", "test", splitCols, "", "") - c.Assert(err, check.IsNil) + require.NoError(t, err) for j, chunk := range chunks { chunkStr, args := chunk.toString("") - c.Log(i, j, chunkStr, args) - c.Assert(chunkStr, check.Equals, testCase.expectResult[j].chunkStr) - c.Assert(args, check.DeepEquals, testCase.expectResult[j].args) + t.Log(i, j, chunkStr, args) + require.Equal(t, testCase.expectResult[j].chunkStr, chunkStr) + require.Equal(t, testCase.expectResult[j].args, args) } } } -func (s *testSpliterSuite) TestRandomSpliter(c *check.C) { +func TestRandomSpliter(t *testing.T) { db, mock, err := sqlmock.New() - c.Assert(err, check.IsNil) + require.NoError(t, err) testCases := []struct { createTableSQL string @@ -205,7 +202,7 @@ func (s *testSpliterSuite) TestRandomSpliter(c *check.C) { for i, testCase := range testCases { tableInfo, err := dbutiltest.GetTableInfoBySQL(testCase.createTableSQL, parser.New()) - c.Assert(err, check.IsNil) + require.NoError(t, err) tableInstance := &TableInstance{ Conn: db, @@ -215,19 +212,19 @@ func (s *testSpliterSuite) TestRandomSpliter(c *check.C) { } splitCols, err := getSplitFields(tableInfo, nil) - c.Assert(err, check.IsNil) + require.NoError(t, err) createFakeResultForRandomSplit(mock, testCase.count, testCase.randomValues) rSpliter := new(randomSpliter) chunks, err := rSpliter.split(tableInstance, splitCols, 2, "TRUE", "") - c.Assert(err, check.IsNil) + require.NoError(t, err) for j, chunk := range chunks { chunkStr, args := chunk.toString("") - c.Log(i, j, chunkStr, args) - c.Assert(chunkStr, check.Equals, testCase.expectResult[j].chunkStr) - c.Assert(args, check.DeepEquals, testCase.expectResult[j].args) + t.Log(i, j, chunkStr, args) + require.Equal(t, testCase.expectResult[j].chunkStr, chunkStr) + require.Equal(t, testCase.expectResult[j].args, args) } } } @@ -249,13 +246,13 @@ func createFakeResultForRandomSplit(mock sqlmock.Sqlmock, count int, randomValue } } -func (s *testSpliterSuite) TestBucketSpliter(c *check.C) { +func TestBucketSpliter(t *testing.T) { db, mock, err := sqlmock.New() - c.Assert(err, check.IsNil) + require.NoError(t, err) createTableSQL := "create table `test`.`test`(`a` int, `b` varchar(10), `c` float, `d` datetime, primary key(`a`, `b`))" tableInfo, err := dbutiltest.GetTableInfoBySQL(createTableSQL, parser.New()) - c.Assert(err, check.IsNil) + require.NoError(t, err) testCases := []struct { chunkSize int @@ -429,12 +426,12 @@ func (s *testSpliterSuite) TestBucketSpliter(c *check.C) { createFakeResultForBucketSplit(mock, testCase.aRandomValues, testCase.bRandomValues) bSpliter := new(bucketSpliter) chunks, err := bSpliter.split(tableInstance, testCase.chunkSize, "TRUE", "") - c.Assert(err, check.IsNil) + require.NoError(t, err) for j, chunk := range chunks { chunkStr, args := chunk.toString("") - c.Log(i, j, chunkStr, args) - c.Assert(chunkStr, check.Equals, testCase.expectResult[j].chunkStr) - c.Assert(args, check.DeepEquals, testCase.expectResult[j].args) + t.Log(i, j, chunkStr, args) + require.Equal(t, testCase.expectResult[j].chunkStr, chunkStr) + require.Equal(t, testCase.expectResult[j].args, args) } } } diff --git a/pkg/diff/util_test.go b/pkg/diff/util_test.go index 5b21eadff5..b78b57770a 100644 --- a/pkg/diff/util_test.go +++ b/pkg/diff/util_test.go @@ -14,43 +14,41 @@ package diff import ( - "github.com/pingcap/check" + "testing" + "github.com/pingcap/tidb/pkg/meta/model" "github.com/pingcap/tidb/pkg/parser" pmodel "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/util/dbutil" "github.com/pingcap/tidb/pkg/util/dbutil/dbutiltest" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testUtilSuite{}) - -type testUtilSuite struct{} - -func (s *testUtilSuite) TestIgnoreColumns(c *check.C) { +func TestIgnoreColumns(t *testing.T) { createTableSQL1 := "CREATE TABLE `test`.`atest` (`a` int, `b` int, `c` int, `d` int, primary key(`a`))" tableInfo1, err := dbutiltest.GetTableInfoBySQL(createTableSQL1, parser.New()) - c.Assert(err, check.IsNil) + require.NoError(t, err) tbInfo := ignoreColumns(tableInfo1, []string{"a"}) - c.Assert(tbInfo.Columns, check.HasLen, 3) - c.Assert(tbInfo.Indices, check.HasLen, 0) - c.Assert(tbInfo.Columns[2].Offset, check.Equals, 2) + require.Len(t, tbInfo.Columns, 3) + require.Len(t, tbInfo.Indices, 0) + require.Equal(t, 2, tbInfo.Columns[2].Offset) createTableSQL2 := "CREATE TABLE `test`.`atest` (`a` int, `b` int, `c` int, `d` int, primary key(`a`), index idx(`b`, `c`))" tableInfo2, err := dbutiltest.GetTableInfoBySQL(createTableSQL2, parser.New()) - c.Assert(err, check.IsNil) + require.NoError(t, err) tbInfo = ignoreColumns(tableInfo2, []string{"a", "b"}) - c.Assert(tbInfo.Columns, check.HasLen, 2) - c.Assert(tbInfo.Indices, check.HasLen, 0) + require.Len(t, tbInfo.Columns, 2) + require.Len(t, tbInfo.Indices, 0) createTableSQL3 := "CREATE TABLE `test`.`atest` (`a` int, `b` int, `c` int, `d` int, primary key(`a`), index idx(`b`, `c`))" tableInfo3, err := dbutiltest.GetTableInfoBySQL(createTableSQL3, parser.New()) - c.Assert(err, check.IsNil) + require.NoError(t, err) tbInfo = ignoreColumns(tableInfo3, []string{"b", "c"}) - c.Assert(tbInfo.Columns, check.HasLen, 2) - c.Assert(tbInfo.Indices, check.HasLen, 1) + require.Len(t, tbInfo.Columns, 2) + require.Len(t, tbInfo.Indices, 1) } -func (s *testUtilSuite) TestRowContainsCols(c *check.C) { +func TestRowContainsCols(t *testing.T) { row := map[string]*dbutil.ColumnData{ "a": nil, "b": nil, @@ -68,14 +66,14 @@ func (s *testUtilSuite) TestRowContainsCols(c *check.C) { } contain := rowContainsCols(row, cols) - c.Assert(contain, check.Equals, true) + require.Equal(t, true, contain) delete(row, "a") contain = rowContainsCols(row, cols) - c.Assert(contain, check.Equals, false) + require.Equal(t, false, contain) } -func (s *testUtilSuite) TestRowToString(c *check.C) { +func TestRowToString(t *testing.T) { row := make(map[string]*dbutil.ColumnData) row["id"] = &dbutil.ColumnData{ Data: []byte("1"), @@ -93,12 +91,12 @@ func (s *testUtilSuite) TestRowToString(c *check.C) { } rowStr := rowToString(row) - c.Assert(rowStr, check.Matches, ".*id: 1.*") - c.Assert(rowStr, check.Matches, ".*name: abc.*") - c.Assert(rowStr, check.Matches, ".*info: IsNull.*") + require.Regexp(t, ".*id: 1.*", rowStr) + require.Regexp(t, ".*name: abc.*", rowStr) + require.Regexp(t, ".*info: IsNull.*", rowStr) } -func (s *testUtilSuite) TestMinLenInSlices(c *check.C) { +func TestMinLenInSlices(t *testing.T) { testCases := []struct { slices [][]string expect int @@ -130,6 +128,6 @@ func (s *testUtilSuite) TestMinLenInSlices(c *check.C) { for _, testCase := range testCases { minLen := minLenInSlices(testCase.slices) - c.Assert(minLen, check.Equals, testCase.expect) + require.Equal(t, testCase.expect, minLen) } }