From 80e49808ec88de264f9b8ef2ce66ed6d1748d866 Mon Sep 17 00:00:00 2001 From: xiaolunzhou <51695571+JayL-zxl@users.noreply.github.com> Date: Mon, 22 Nov 2021 20:51:38 +0800 Subject: [PATCH 1/4] addd --- br/pkg/lightning/backend/backend_test.go | 185 ++++++++++++----------- 1 file changed, 96 insertions(+), 89 deletions(-) diff --git a/br/pkg/lightning/backend/backend_test.go b/br/pkg/lightning/backend/backend_test.go index e2ca9703a8a16..70a503cf4fabc 100644 --- a/br/pkg/lightning/backend/backend_test.go +++ b/br/pkg/lightning/backend/backend_test.go @@ -13,6 +13,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" "github.com/pingcap/tidb/br/pkg/mock" "github.com/pingcap/tidb/parser/mysql" + "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/oracle" ) @@ -31,22 +32,25 @@ func Test(t *testing.T) { // FIXME: Cannot use the real SetUpTest/TearDownTest to set up the mock // otherwise the mock error will be ignored. - -func (s *backendSuite) setUpTest(c gomock.TestReporter) { - s.controller = gomock.NewController(c) - s.mockBackend = mock.NewMockBackend(s.controller) - s.backend = backend.MakeBackend(s.mockBackend) - s.ts = oracle.ComposeTS(time.Now().Unix()*1000, 0) +func setUpTest(c gomock.TestReporter) *backendSuite { + controller := gomock.NewController(c) + mockBackend := mock.NewMockBackend(controller) + return &backendSuite{ + controller: controller, + mockBackend: mockBackend, + backend: backend.MakeBackend(mockBackend), + ts: oracle.ComposeTS(time.Now().Unix()*1000, 0), + } } func (s *backendSuite) tearDownTest() { s.controller.Finish() } -func (s *backendSuite) TestOpenCloseImportCleanUpEngine(c *C) { - s.setUpTest(c) +func TestOpenCloseImportCleanUpEngine(t *testing.T) { + s := setUpTest(t) defer s.tearDownTest() - + setUpTest(t) ctx := context.Background() engineUUID := uuid.MustParse("902efee3-a3f9-53d4-8c82-f12fb1900cd1") @@ -67,17 +71,17 @@ func (s *backendSuite) TestOpenCloseImportCleanUpEngine(c *C) { After(importCall) engine, err := s.backend.OpenEngine(ctx, &backend.EngineConfig{}, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) closedEngine, err := engine.Close(ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) err = closedEngine.Import(ctx, 1) - c.Assert(err, IsNil) + require.NoError(t, err) err = closedEngine.Cleanup(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *backendSuite) TestUnsafeCloseEngine(c *C) { - s.setUpTest(c) +func TestUnsafeCloseEngine(t *testing.T) { + s := setUpTest(t) defer s.tearDownTest() ctx := context.Background() @@ -92,13 +96,13 @@ func (s *backendSuite) TestUnsafeCloseEngine(c *C) { After(closeCall) closedEngine, err := s.backend.UnsafeCloseEngine(ctx, nil, "`db`.`table`", -1) - c.Assert(err, IsNil) + require.NoError(t, err) err = closedEngine.Cleanup(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *backendSuite) TestUnsafeCloseEngineWithUUID(c *C) { - s.setUpTest(c) +func TestUnsafeCloseEngineWithUUID(t *testing.T) { + s := setUpTest(t) defer s.tearDownTest() ctx := context.Background() @@ -113,13 +117,13 @@ func (s *backendSuite) TestUnsafeCloseEngineWithUUID(c *C) { After(closeCall) closedEngine, err := s.backend.UnsafeCloseEngineWithUUID(ctx, nil, "some_tag", engineUUID) - c.Assert(err, IsNil) + require.NoError(t, err) err = closedEngine.Cleanup(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *backendSuite) TestWriteEngine(c *C) { - s.setUpTest(c) +func TestWriteEngine(t *testing.T) { + s := setUpTest(t) defer s.tearDownTest() ctx := context.Background() @@ -145,19 +149,19 @@ func (s *backendSuite) TestWriteEngine(c *C) { Return(nil) engine, err := s.backend.OpenEngine(ctx, &backend.EngineConfig{}, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) writer, err := engine.LocalWriter(ctx, &backend.LocalWriterConfig{}) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, []string{"c1", "c2"}, rows1) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, []string{"c1", "c2"}, rows2) - c.Assert(err, IsNil) + require.NoError(t, err) _, err = writer.Close(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *backendSuite) TestWriteToEngineWithNothing(c *C) { - s.setUpTest(c) +func TestWriteToEngineWithNothing(t *testing.T) { + s := setUpTest(t) defer s.tearDownTest() ctx := context.Background() @@ -170,17 +174,17 @@ func (s *backendSuite) TestWriteToEngineWithNothing(c *C) { s.mockBackend.EXPECT().LocalWriter(ctx, &backend.LocalWriterConfig{}, gomock.Any()).Return(mockWriter, nil) engine, err := s.backend.OpenEngine(ctx, &backend.EngineConfig{}, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) writer, err := engine.LocalWriter(ctx, &backend.LocalWriterConfig{}) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, nil, emptyRows) - c.Assert(err, IsNil) + require.NoError(t, err) _, err = writer.Close(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *backendSuite) TestOpenEngineFailed(c *C) { - s.setUpTest(c) +func TestOpenEngineFailed(t *testing.T) { + s := setUpTest(t) defer s.tearDownTest() ctx := context.Background() @@ -189,11 +193,11 @@ func (s *backendSuite) TestOpenEngineFailed(c *C) { Return(errors.New("fake unrecoverable open error")) _, err := s.backend.OpenEngine(ctx, &backend.EngineConfig{}, "`db`.`table`", 1) - c.Assert(err, ErrorMatches, "fake unrecoverable open error") + require.Equal(t, "fake unrecoverable open error", err.Error()) } -func (s *backendSuite) TestWriteEngineFailed(c *C) { - s.setUpTest(c) +func TestWriteEngineFailed(t *testing.T) { + s := setUpTest(t) defer s.tearDownTest() ctx := context.Background() @@ -209,17 +213,18 @@ func (s *backendSuite) TestWriteEngineFailed(c *C) { mockWriter.EXPECT().Close(ctx).Return(nil, nil) engine, err := s.backend.OpenEngine(ctx, &backend.EngineConfig{}, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) writer, err := engine.LocalWriter(ctx, &backend.LocalWriterConfig{}) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, nil, rows) - c.Assert(err, ErrorMatches, "fake unrecoverable write error.*") + require.Error(t, err) + require.Regexp(t, "fake unrecoverable write error.*", err.Error()) _, err = writer.Close(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *backendSuite) TestWriteBatchSendFailedWithRetry(c *C) { - s.setUpTest(c) +func TestWriteBatchSendFailedWithRetry(t *testing.T) { + s := setUpTest(t) defer s.tearDownTest() ctx := context.Background() @@ -235,17 +240,18 @@ func (s *backendSuite) TestWriteBatchSendFailedWithRetry(c *C) { mockWriter.EXPECT().Close(ctx).Return(nil, nil).MinTimes(1) engine, err := s.backend.OpenEngine(ctx, &backend.EngineConfig{}, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) writer, err := engine.LocalWriter(ctx, &backend.LocalWriterConfig{}) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, nil, rows) - c.Assert(err, ErrorMatches, ".*fake recoverable write batch error") + require.Error(t, err) + require.Regexp(t, ".*fake recoverable write batch error", err.Error()) _, err = writer.Close(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *backendSuite) TestImportFailedNoRetry(c *C) { - s.setUpTest(c) +func TestImportFailedNoRetry(t *testing.T) { + s := setUpTest(t) defer s.tearDownTest() ctx := context.Background() @@ -256,13 +262,14 @@ func (s *backendSuite) TestImportFailedNoRetry(c *C) { Return(errors.Annotate(context.Canceled, "fake unrecoverable import error")) closedEngine, err := s.backend.UnsafeCloseEngine(ctx, nil, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) err = closedEngine.Import(ctx, 1) - c.Assert(err, ErrorMatches, "fake unrecoverable import error.*") + require.Error(t, err) + require.Regexp(t, "fake unrecoverable import error.*", err.Error()) } -func (s *backendSuite) TestImportFailedWithRetry(c *C) { - s.setUpTest(c) +func TestImportFailedWithRetry(t *testing.T) { + s := setUpTest(t) defer s.tearDownTest() ctx := context.Background() @@ -275,13 +282,14 @@ func (s *backendSuite) TestImportFailedWithRetry(c *C) { s.mockBackend.EXPECT().RetryImportDelay().Return(time.Duration(0)).AnyTimes() closedEngine, err := s.backend.UnsafeCloseEngine(ctx, nil, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) err = closedEngine.Import(ctx, 1) - c.Assert(err, ErrorMatches, ".*fake recoverable import error") + require.Error(t, err) + require.Regexp(t, ".*fake recoverable import error", err.Error()) } -func (s *backendSuite) TestImportFailedRecovered(c *C) { - s.setUpTest(c) +func TestImportFailedRecovered(t *testing.T) { + s := setUpTest(t) defer s.tearDownTest() ctx := context.Background() @@ -296,14 +304,14 @@ func (s *backendSuite) TestImportFailedRecovered(c *C) { s.mockBackend.EXPECT().RetryImportDelay().Return(time.Duration(0)).AnyTimes() closedEngine, err := s.backend.UnsafeCloseEngine(ctx, nil, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) err = closedEngine.Import(ctx, 1) - c.Assert(err, IsNil) + require.NoError(t, err) } //nolint:interfacer // change test case signature causes check panicking. -func (s *backendSuite) TestClose(c *C) { - s.setUpTest(c) +func TestClose(t *testing.T) { + s := setUpTest(t) defer s.tearDownTest() s.mockBackend.EXPECT().Close().Return() @@ -311,18 +319,17 @@ func (s *backendSuite) TestClose(c *C) { s.backend.Close() } -func (s *backendSuite) TestMakeEmptyRows(c *C) { - s.setUpTest(c) +func TestMakeEmptyRows(t *testing.T) { + s := setUpTest(t) defer s.tearDownTest() rows := mock.NewMockRows(s.controller) s.mockBackend.EXPECT().MakeEmptyRows().Return(rows) - - c.Assert(s.mockBackend.MakeEmptyRows(), Equals, rows) + require.Equal(t, rows, s.mockBackend.MakeEmptyRows()) } -func (s *backendSuite) TestNewEncoder(c *C) { - s.setUpTest(c) +func TestNewEncoder(t *testing.T) { + s := setUpTest(t) defer s.tearDownTest() encoder := mock.NewMockEncoder(s.controller) @@ -330,12 +337,12 @@ func (s *backendSuite) TestNewEncoder(c *C) { s.mockBackend.EXPECT().NewEncoder(nil, options).Return(encoder, nil) realEncoder, err := s.mockBackend.NewEncoder(nil, options) - c.Assert(realEncoder, Equals, encoder) - c.Assert(err, IsNil) + require.Equal(t, realEncoder, encoder) + require.NoError(t, err) } -func (s *backendSuite) TestCheckDiskQuota(c *C) { - s.setUpTest(c) +func TestCheckDiskQuota(t *testing.T) { + s := setUpTest(t) defer s.tearDownTest() uuid1 := uuid.MustParse("11111111-1111-1111-1111-111111111111") @@ -381,29 +388,29 @@ func (s *backendSuite) TestCheckDiskQuota(c *C) { // No quota exceeded le, iple, ds, ms := s.backend.CheckDiskQuota(30000) - c.Assert(le, HasLen, 0) - c.Assert(iple, Equals, 0) - c.Assert(ds, Equals, int64(9000)) - c.Assert(ms, Equals, int64(16000)) + require.Len(t, le, 0) + require.Equal(t, 0, iple) + require.Equal(t, int64(9000), ds) + require.Equal(t, int64(16000), ms) // Quota exceeded, the largest one is out le, iple, ds, ms = s.backend.CheckDiskQuota(20000) - c.Assert(le, DeepEquals, []uuid.UUID{uuid9}) - c.Assert(iple, Equals, 0) - c.Assert(ds, Equals, int64(9000)) - c.Assert(ms, Equals, int64(16000)) + require.Equal(t, []uuid.UUID{uuid9}, le) + require.Equal(t, 0, iple) + require.Equal(t, int64(9000), ds) + require.Equal(t, int64(16000), ms) // Quota exceeded, the importing one should be ranked least priority le, iple, ds, ms = s.backend.CheckDiskQuota(12000) - c.Assert(le, DeepEquals, []uuid.UUID{uuid5, uuid9}) - c.Assert(iple, Equals, 0) - c.Assert(ds, Equals, int64(9000)) - c.Assert(ms, Equals, int64(16000)) + require.Equal(t, []uuid.UUID{uuid5, uuid9}, le) + require.Equal(t, 0, iple) + require.Equal(t, int64(9000), ds) + require.Equal(t, int64(16000), ms) // Quota exceeded, the importing ones should not be visible le, iple, ds, ms = s.backend.CheckDiskQuota(5000) - c.Assert(le, DeepEquals, []uuid.UUID{uuid1, uuid5, uuid9}) - c.Assert(iple, Equals, 1) - c.Assert(ds, Equals, int64(9000)) - c.Assert(ms, Equals, int64(16000)) + require.Equal(t, []uuid.UUID{uuid1, uuid5, uuid9}, le) + require.Equal(t, 1, iple) + require.Equal(t, int64(9000), ds) + require.Equal(t, int64(16000), ms) } From 54ac4737f1dd2717052fc372a2f141728ce5adca Mon Sep 17 00:00:00 2001 From: xiaolunzhou <51695571+JayL-zxl@users.noreply.github.com> Date: Mon, 22 Nov 2021 22:02:25 +0800 Subject: [PATCH 2/4] add --- br/pkg/lightning/backend/backend_test.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/br/pkg/lightning/backend/backend_test.go b/br/pkg/lightning/backend/backend_test.go index 70a503cf4fabc..ed5906b61d0ce 100644 --- a/br/pkg/lightning/backend/backend_test.go +++ b/br/pkg/lightning/backend/backend_test.go @@ -48,9 +48,9 @@ func (s *backendSuite) tearDownTest() { } func TestOpenCloseImportCleanUpEngine(t *testing.T) { + t.Parallel() s := setUpTest(t) defer s.tearDownTest() - setUpTest(t) ctx := context.Background() engineUUID := uuid.MustParse("902efee3-a3f9-53d4-8c82-f12fb1900cd1") @@ -81,6 +81,7 @@ func TestOpenCloseImportCleanUpEngine(t *testing.T) { } func TestUnsafeCloseEngine(t *testing.T) { + t.Parallel() s := setUpTest(t) defer s.tearDownTest() @@ -102,6 +103,7 @@ func TestUnsafeCloseEngine(t *testing.T) { } func TestUnsafeCloseEngineWithUUID(t *testing.T) { + t.Parallel() s := setUpTest(t) defer s.tearDownTest() @@ -123,6 +125,7 @@ func TestUnsafeCloseEngineWithUUID(t *testing.T) { } func TestWriteEngine(t *testing.T) { + t.Parallel() s := setUpTest(t) defer s.tearDownTest() @@ -161,6 +164,7 @@ func TestWriteEngine(t *testing.T) { } func TestWriteToEngineWithNothing(t *testing.T) { + t.Parallel() s := setUpTest(t) defer s.tearDownTest() @@ -184,6 +188,7 @@ func TestWriteToEngineWithNothing(t *testing.T) { } func TestOpenEngineFailed(t *testing.T) { + t.Parallel() s := setUpTest(t) defer s.tearDownTest() @@ -197,6 +202,7 @@ func TestOpenEngineFailed(t *testing.T) { } func TestWriteEngineFailed(t *testing.T) { + t.Parallel() s := setUpTest(t) defer s.tearDownTest() @@ -224,6 +230,7 @@ func TestWriteEngineFailed(t *testing.T) { } func TestWriteBatchSendFailedWithRetry(t *testing.T) { + t.Parallel() s := setUpTest(t) defer s.tearDownTest() @@ -251,6 +258,7 @@ func TestWriteBatchSendFailedWithRetry(t *testing.T) { } func TestImportFailedNoRetry(t *testing.T) { + t.Parallel() s := setUpTest(t) defer s.tearDownTest() @@ -269,6 +277,7 @@ func TestImportFailedNoRetry(t *testing.T) { } func TestImportFailedWithRetry(t *testing.T) { + t.Parallel() s := setUpTest(t) defer s.tearDownTest() @@ -289,6 +298,7 @@ func TestImportFailedWithRetry(t *testing.T) { } func TestImportFailedRecovered(t *testing.T) { + t.Parallel() s := setUpTest(t) defer s.tearDownTest() @@ -311,6 +321,7 @@ func TestImportFailedRecovered(t *testing.T) { //nolint:interfacer // change test case signature causes check panicking. func TestClose(t *testing.T) { + t.Parallel() s := setUpTest(t) defer s.tearDownTest() @@ -320,6 +331,7 @@ func TestClose(t *testing.T) { } func TestMakeEmptyRows(t *testing.T) { + t.Parallel() s := setUpTest(t) defer s.tearDownTest() @@ -329,6 +341,7 @@ func TestMakeEmptyRows(t *testing.T) { } func TestNewEncoder(t *testing.T) { + t.Parallel() s := setUpTest(t) defer s.tearDownTest() @@ -342,6 +355,7 @@ func TestNewEncoder(t *testing.T) { } func TestCheckDiskQuota(t *testing.T) { + t.Parallel() s := setUpTest(t) defer s.tearDownTest() From 93832956ff11128b0f03cb22bd7b09011c1655b8 Mon Sep 17 00:00:00 2001 From: xiaolunzhou <51695571+JayL-zxl@users.noreply.github.com> Date: Mon, 22 Nov 2021 22:17:11 +0800 Subject: [PATCH 3/4] add --- br/pkg/lightning/backend/backend_test.go | 41 +++++++++--------------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/br/pkg/lightning/backend/backend_test.go b/br/pkg/lightning/backend/backend_test.go index ed5906b61d0ce..95650f60d7b9f 100644 --- a/br/pkg/lightning/backend/backend_test.go +++ b/br/pkg/lightning/backend/backend_test.go @@ -7,7 +7,6 @@ import ( "github.com/golang/mock/gomock" "github.com/google/uuid" - . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" @@ -24,15 +23,7 @@ type backendSuite struct { ts uint64 } -var _ = Suite(&backendSuite{}) - -func Test(t *testing.T) { - TestingT(t) -} - -// FIXME: Cannot use the real SetUpTest/TearDownTest to set up the mock -// otherwise the mock error will be ignored. -func setUpTest(c gomock.TestReporter) *backendSuite { +func createBackendSuite(c gomock.TestReporter) *backendSuite { controller := gomock.NewController(c) mockBackend := mock.NewMockBackend(controller) return &backendSuite{ @@ -49,7 +40,7 @@ func (s *backendSuite) tearDownTest() { func TestOpenCloseImportCleanUpEngine(t *testing.T) { t.Parallel() - s := setUpTest(t) + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() engineUUID := uuid.MustParse("902efee3-a3f9-53d4-8c82-f12fb1900cd1") @@ -82,7 +73,7 @@ func TestOpenCloseImportCleanUpEngine(t *testing.T) { func TestUnsafeCloseEngine(t *testing.T) { t.Parallel() - s := setUpTest(t) + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -104,7 +95,7 @@ func TestUnsafeCloseEngine(t *testing.T) { func TestUnsafeCloseEngineWithUUID(t *testing.T) { t.Parallel() - s := setUpTest(t) + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -126,7 +117,7 @@ func TestUnsafeCloseEngineWithUUID(t *testing.T) { func TestWriteEngine(t *testing.T) { t.Parallel() - s := setUpTest(t) + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -165,7 +156,7 @@ func TestWriteEngine(t *testing.T) { func TestWriteToEngineWithNothing(t *testing.T) { t.Parallel() - s := setUpTest(t) + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -189,7 +180,7 @@ func TestWriteToEngineWithNothing(t *testing.T) { func TestOpenEngineFailed(t *testing.T) { t.Parallel() - s := setUpTest(t) + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -203,7 +194,7 @@ func TestOpenEngineFailed(t *testing.T) { func TestWriteEngineFailed(t *testing.T) { t.Parallel() - s := setUpTest(t) + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -231,7 +222,7 @@ func TestWriteEngineFailed(t *testing.T) { func TestWriteBatchSendFailedWithRetry(t *testing.T) { t.Parallel() - s := setUpTest(t) + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -259,7 +250,7 @@ func TestWriteBatchSendFailedWithRetry(t *testing.T) { func TestImportFailedNoRetry(t *testing.T) { t.Parallel() - s := setUpTest(t) + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -278,7 +269,7 @@ func TestImportFailedNoRetry(t *testing.T) { func TestImportFailedWithRetry(t *testing.T) { t.Parallel() - s := setUpTest(t) + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -299,7 +290,7 @@ func TestImportFailedWithRetry(t *testing.T) { func TestImportFailedRecovered(t *testing.T) { t.Parallel() - s := setUpTest(t) + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -322,7 +313,7 @@ func TestImportFailedRecovered(t *testing.T) { //nolint:interfacer // change test case signature causes check panicking. func TestClose(t *testing.T) { t.Parallel() - s := setUpTest(t) + s := createBackendSuite(t) defer s.tearDownTest() s.mockBackend.EXPECT().Close().Return() @@ -332,7 +323,7 @@ func TestClose(t *testing.T) { func TestMakeEmptyRows(t *testing.T) { t.Parallel() - s := setUpTest(t) + s := createBackendSuite(t) defer s.tearDownTest() rows := mock.NewMockRows(s.controller) @@ -342,7 +333,7 @@ func TestMakeEmptyRows(t *testing.T) { func TestNewEncoder(t *testing.T) { t.Parallel() - s := setUpTest(t) + s := createBackendSuite(t) defer s.tearDownTest() encoder := mock.NewMockEncoder(s.controller) @@ -356,7 +347,7 @@ func TestNewEncoder(t *testing.T) { func TestCheckDiskQuota(t *testing.T) { t.Parallel() - s := setUpTest(t) + s := createBackendSuite(t) defer s.tearDownTest() uuid1 := uuid.MustParse("11111111-1111-1111-1111-111111111111") From 8e055e57cdbc9fccfa1f896634d79572fa07b33f Mon Sep 17 00:00:00 2001 From: xiaolunzhou <51695571+JayL-zxl@users.noreply.github.com> Date: Tue, 23 Nov 2021 14:10:33 +0800 Subject: [PATCH 4/4] issue_29982 --- br/pkg/lightning/backend/tidb/tidb_test.go | 176 ++++++++++++--------- 1 file changed, 97 insertions(+), 79 deletions(-) diff --git a/br/pkg/lightning/backend/tidb/tidb_test.go b/br/pkg/lightning/backend/tidb/tidb_test.go index e37f53d12b27e..9592051e27281 100644 --- a/br/pkg/lightning/backend/tidb/tidb_test.go +++ b/br/pkg/lightning/backend/tidb/tidb_test.go @@ -22,7 +22,6 @@ import ( "testing" "github.com/DATA-DOG/go-sqlmock" - . "github.com/pingcap/check" "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" "github.com/pingcap/tidb/br/pkg/lightning/backend/tidb" @@ -36,15 +35,10 @@ import ( "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" + "github.com/stretchr/testify/require" "go.uber.org/atomic" ) -func Test(t *testing.T) { - TestingT(t) -} - -var _ = Suite(&mysqlSuite{}) - type mysqlSuite struct { dbHandle *sql.DB mockDB sqlmock.Sqlmock @@ -52,9 +46,9 @@ type mysqlSuite struct { tbl table.Table } -func (s *mysqlSuite) SetUpTest(c *C) { +func createMysqlSuite(t *testing.T) *mysqlSuite { db, mock, err := sqlmock.New() - c.Assert(err, IsNil) + require.NoError(t, err) tys := []byte{ mysql.TypeLong, mysql.TypeLong, mysql.TypeTiny, mysql.TypeInt24, mysql.TypeFloat, mysql.TypeDouble, @@ -67,20 +61,20 @@ func (s *mysqlSuite) SetUpTest(c *C) { } tblInfo := &model.TableInfo{ID: 1, Columns: cols, PKIsHandle: false, State: model.StatePublic} tbl, err := tables.TableFromMeta(kv.NewPanickingAllocators(0), tblInfo) - c.Assert(err, IsNil) - - s.dbHandle = db - s.mockDB = mock - s.backend = tidb.NewTiDBBackend(db, config.ReplaceOnDup, errormanager.New(nil, config.NewConfig())) - s.tbl = tbl + require.NoError(t, err) + backend := tidb.NewTiDBBackend(db, config.ReplaceOnDup, errormanager.New(nil, config.NewConfig())) + return &mysqlSuite{dbHandle: db, mockDB: mock, backend: backend, tbl: tbl} } -func (s *mysqlSuite) TearDownTest(c *C) { +func (s *mysqlSuite) TearDownTest(t *testing.T) { s.backend.Close() - c.Assert(s.mockDB.ExpectationsWereMet(), IsNil) + require.NoError(t, s.mockDB.ExpectationsWereMet()) } -func (s *mysqlSuite) TestWriteRowsReplaceOnDup(c *C) { +func TestWriteRowsReplaceOnDup(t *testing.T) { + t.Parallel() + s := createMysqlSuite(t) + defer s.TearDownTest(t) s.mockDB. ExpectExec("\\QREPLACE INTO `foo`.`bar`(`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`i`,`j`,`k`,`l`,`m`,`n`,`o`) VALUES(18446744073709551615,-9223372036854775808,0,NULL,7.5,5e-324,1.7976931348623157e+308,0,'甲乙丙\\r\\n\\0\\Z''\"\\\\`',x'000000abcdef',2557891634,'12.5',51)\\E"). WillReturnResult(sqlmock.NewResult(1, 1)) @@ -89,7 +83,7 @@ func (s *mysqlSuite) TestWriteRowsReplaceOnDup(c *C) { logger := log.L() engine, err := s.backend.OpenEngine(ctx, &backend.EngineConfig{}, "`foo`.`bar`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) dataRows := s.backend.MakeEmptyRows() dataChecksum := verification.MakeKVChecksum(0, 0, 0) @@ -103,7 +97,7 @@ func (s *mysqlSuite) TestWriteRowsReplaceOnDup(c *C) { } perms = append(perms, -1) encoder, err := s.backend.NewEncoder(s.tbl, &kv.SessionOptions{SQLMode: 0, Timestamp: 1234567890}) - c.Assert(err, IsNil) + require.NoError(t, err) row, err := encoder.Encode(logger, []types.Datum{ types.NewUintDatum(18446744073709551615), types.NewIntDatum(-9223372036854775808), @@ -121,19 +115,22 @@ func (s *mysqlSuite) TestWriteRowsReplaceOnDup(c *C) { types.NewDecimalDatum(types.NewDecFromFloatForTest(12.5)), types.NewMysqlEnumDatum(types.Enum{Name: "ENUM_NAME", Value: 51}), }, 1, perms, "0.csv", 0) - c.Assert(err, IsNil) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) writer, err := engine.LocalWriter(ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"}, dataRows) - c.Assert(err, IsNil) + require.NoError(t, err) st, err := writer.Close(ctx) - c.Assert(err, IsNil) - c.Assert(st, IsNil) + require.NoError(t, err) + require.Nil(t, st) } -func (s *mysqlSuite) TestWriteRowsIgnoreOnDup(c *C) { +func TestWriteRowsIgnoreOnDup(t *testing.T) { + t.Parallel() + s := createMysqlSuite(t) + defer s.TearDownTest(t) s.mockDB. ExpectExec("\\QINSERT IGNORE INTO `foo`.`bar`(`a`) VALUES(1)\\E"). WillReturnResult(sqlmock.NewResult(1, 1)) @@ -143,7 +140,7 @@ func (s *mysqlSuite) TestWriteRowsIgnoreOnDup(c *C) { ignoreBackend := tidb.NewTiDBBackend(s.dbHandle, config.IgnoreOnDup, errormanager.New(nil, config.NewConfig())) engine, err := ignoreBackend.OpenEngine(ctx, &backend.EngineConfig{}, "`foo`.`bar`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) dataRows := ignoreBackend.MakeEmptyRows() dataChecksum := verification.MakeKVChecksum(0, 0, 0) @@ -151,33 +148,36 @@ func (s *mysqlSuite) TestWriteRowsIgnoreOnDup(c *C) { indexChecksum := verification.MakeKVChecksum(0, 0, 0) encoder, err := ignoreBackend.NewEncoder(s.tbl, &kv.SessionOptions{}) - c.Assert(err, IsNil) + require.NoError(t, err) row, err := encoder.Encode(logger, []types.Datum{ types.NewIntDatum(1), }, 1, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1}, "1.csv", 0) - c.Assert(err, IsNil) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) writer, err := engine.LocalWriter(ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, []string{"a"}, dataRows) - c.Assert(err, IsNil) + require.NoError(t, err) _, err = writer.Close(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) // test encode rows with _tidb_rowid encoder, err = ignoreBackend.NewEncoder(s.tbl, &kv.SessionOptions{}) - c.Assert(err, IsNil) + require.NoError(t, err) rowWithID, err := encoder.Encode(logger, []types.Datum{ types.NewIntDatum(1), types.NewIntDatum(1), // _tidb_rowid field }, 1, []int{0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1}, "2.csv", 0) - c.Assert(err, IsNil) + require.NoError(t, err) // tidbRow is stringer. - c.Assert(fmt.Sprint(rowWithID), Equals, "(1,1)") + require.Equal(t, "(1,1)", fmt.Sprint(rowWithID)) } -func (s *mysqlSuite) TestWriteRowsErrorOnDup(c *C) { +func TestWriteRowsErrorOnDup(t *testing.T) { + t.Parallel() + s := createMysqlSuite(t) + defer s.TearDownTest(t) s.mockDB. ExpectExec("\\QINSERT INTO `foo`.`bar`(`a`) VALUES(1)\\E"). WillReturnResult(sqlmock.NewResult(1, 1)) @@ -187,7 +187,7 @@ func (s *mysqlSuite) TestWriteRowsErrorOnDup(c *C) { ignoreBackend := tidb.NewTiDBBackend(s.dbHandle, config.ErrorOnDup, errormanager.New(nil, config.NewConfig())) engine, err := ignoreBackend.OpenEngine(ctx, &backend.EngineConfig{}, "`foo`.`bar`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) dataRows := ignoreBackend.MakeEmptyRows() dataChecksum := verification.MakeKVChecksum(0, 0, 0) @@ -195,26 +195,28 @@ func (s *mysqlSuite) TestWriteRowsErrorOnDup(c *C) { indexChecksum := verification.MakeKVChecksum(0, 0, 0) encoder, err := ignoreBackend.NewEncoder(s.tbl, &kv.SessionOptions{}) - c.Assert(err, IsNil) + require.NoError(t, err) row, err := encoder.Encode(logger, []types.Datum{ types.NewIntDatum(1), }, 1, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1}, "3.csv", 0) - c.Assert(err, IsNil) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) writer, err := engine.LocalWriter(ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, []string{"a"}, dataRows) - c.Assert(err, IsNil) + require.NoError(t, err) st, err := writer.Close(ctx) - c.Assert(err, IsNil) - c.Assert(st, IsNil) + require.NoError(t, err) + require.Nil(t, st) } // TODO: temporarily disable this test before we fix strict mode //nolint:unused -func (s *mysqlSuite) testStrictMode(c *C) { +func testStrictMode(t *testing.T) { + s := createMysqlSuite(t) + defer s.TearDownTest(t) ft := *types.NewFieldType(mysql.TypeVarchar) ft.Charset = charset.CharsetUTF8MB4 col0 := &model.ColumnInfo{ID: 1, Name: model.NewCIStr("s0"), State: model.StatePublic, Offset: 0, FieldType: ft} @@ -223,34 +225,39 @@ func (s *mysqlSuite) testStrictMode(c *C) { col1 := &model.ColumnInfo{ID: 2, Name: model.NewCIStr("s1"), State: model.StatePublic, Offset: 1, FieldType: ft} tblInfo := &model.TableInfo{ID: 1, Columns: []*model.ColumnInfo{col0, col1}, PKIsHandle: false, State: model.StatePublic} tbl, err := tables.TableFromMeta(kv.NewPanickingAllocators(0), tblInfo) - c.Assert(err, IsNil) + require.NoError(t, err) bk := tidb.NewTiDBBackend(s.dbHandle, config.ErrorOnDup, errormanager.New(nil, config.NewConfig())) encoder, err := bk.NewEncoder(tbl, &kv.SessionOptions{SQLMode: mysql.ModeStrictAllTables}) - c.Assert(err, IsNil) + require.NoError(t, err) logger := log.L() _, err = encoder.Encode(logger, []types.Datum{ types.NewStringDatum("test"), }, 1, []int{0, -1, -1}, "4.csv", 0) - c.Assert(err, IsNil) + require.NoError(t, err) _, err = encoder.Encode(logger, []types.Datum{ types.NewStringDatum("\xff\xff\xff\xff"), }, 1, []int{0, -1, -1}, "5.csv", 0) - c.Assert(err, ErrorMatches, `.*incorrect utf8 value .* for column s0`) + require.Error(t, err) + require.Regexp(t, `.*incorrect utf8 value .* for column s0`, err.Error()) // oepn a new encode because column count changed. encoder, err = bk.NewEncoder(tbl, &kv.SessionOptions{SQLMode: mysql.ModeStrictAllTables}) - c.Assert(err, IsNil) + require.NoError(t, err) _, err = encoder.Encode(logger, []types.Datum{ types.NewStringDatum(""), types.NewStringDatum("非 ASCII 字符串"), }, 1, []int{0, 1, -1}, "6.csv", 0) - c.Assert(err, ErrorMatches, ".*incorrect ascii value .* for column s1") + require.Error(t, err) + require.Regexp(t, ".*incorrect ascii value .* for column s1", err.Error()) } -func (s *mysqlSuite) TestFetchRemoteTableModels_3_x(c *C) { +func TestFetchRemoteTableModels_3_x(t *testing.T) { + t.Parallel() + s := createMysqlSuite(t) + defer s.TearDownTest(t) s.mockDB.ExpectBegin() s.mockDB.ExpectQuery("SELECT version()"). WillReturnRows(sqlmock.NewRows([]string{"version()"}).AddRow("5.7.25-TiDB-v3.0.18")) @@ -262,8 +269,8 @@ func (s *mysqlSuite) TestFetchRemoteTableModels_3_x(c *C) { bk := tidb.NewTiDBBackend(s.dbHandle, config.ErrorOnDup, errormanager.New(nil, config.NewConfig())) tableInfos, err := bk.FetchRemoteTableModels(context.Background(), "test") - c.Assert(err, IsNil) - c.Assert(tableInfos, DeepEquals, []*model.TableInfo{ + require.NoError(t, err) + require.Equal(t, []*model.TableInfo{ { Name: model.NewCIStr("t"), State: model.StatePublic, @@ -279,10 +286,13 @@ func (s *mysqlSuite) TestFetchRemoteTableModels_3_x(c *C) { }, }, }, - }) + }, tableInfos) } -func (s *mysqlSuite) TestFetchRemoteTableModels_4_0(c *C) { +func TestFetchRemoteTableModels_4_0(t *testing.T) { + t.Parallel() + s := createMysqlSuite(t) + defer s.TearDownTest(t) s.mockDB.ExpectBegin() s.mockDB.ExpectQuery("SELECT version()"). WillReturnRows(sqlmock.NewRows([]string{"version()"}).AddRow("5.7.25-TiDB-v4.0.0")) @@ -297,8 +307,8 @@ func (s *mysqlSuite) TestFetchRemoteTableModels_4_0(c *C) { bk := tidb.NewTiDBBackend(s.dbHandle, config.ErrorOnDup, errormanager.New(nil, config.NewConfig())) tableInfos, err := bk.FetchRemoteTableModels(context.Background(), "test") - c.Assert(err, IsNil) - c.Assert(tableInfos, DeepEquals, []*model.TableInfo{ + require.NoError(t, err) + require.Equal(t, []*model.TableInfo{ { Name: model.NewCIStr("t"), State: model.StatePublic, @@ -314,10 +324,13 @@ func (s *mysqlSuite) TestFetchRemoteTableModels_4_0(c *C) { }, }, }, - }) + }, tableInfos) } -func (s *mysqlSuite) TestFetchRemoteTableModels_4_x_auto_increment(c *C) { +func TestFetchRemoteTableModels_4_x_auto_increment(t *testing.T) { + t.Parallel() + s := createMysqlSuite(t) + defer s.TearDownTest(t) s.mockDB.ExpectBegin() s.mockDB.ExpectQuery("SELECT version()"). WillReturnRows(sqlmock.NewRows([]string{"version()"}).AddRow("5.7.25-TiDB-v4.0.7")) @@ -332,8 +345,8 @@ func (s *mysqlSuite) TestFetchRemoteTableModels_4_x_auto_increment(c *C) { bk := tidb.NewTiDBBackend(s.dbHandle, config.ErrorOnDup, errormanager.New(nil, config.NewConfig())) tableInfos, err := bk.FetchRemoteTableModels(context.Background(), "test") - c.Assert(err, IsNil) - c.Assert(tableInfos, DeepEquals, []*model.TableInfo{ + require.NoError(t, err) + require.Equal(t, []*model.TableInfo{ { Name: model.NewCIStr("t"), State: model.StatePublic, @@ -349,10 +362,13 @@ func (s *mysqlSuite) TestFetchRemoteTableModels_4_x_auto_increment(c *C) { }, }, }, - }) + }, tableInfos) } -func (s *mysqlSuite) TestFetchRemoteTableModels_4_x_auto_random(c *C) { +func TestFetchRemoteTableModels_4_x_auto_random(t *testing.T) { + t.Parallel() + s := createMysqlSuite(t) + defer s.TearDownTest(t) s.mockDB.ExpectBegin() s.mockDB.ExpectQuery("SELECT version()"). WillReturnRows(sqlmock.NewRows([]string{"version()"}).AddRow("5.7.25-TiDB-v4.0.7")) @@ -367,8 +383,8 @@ func (s *mysqlSuite) TestFetchRemoteTableModels_4_x_auto_random(c *C) { bk := tidb.NewTiDBBackend(s.dbHandle, config.ErrorOnDup, errormanager.New(nil, config.NewConfig())) tableInfos, err := bk.FetchRemoteTableModels(context.Background(), "test") - c.Assert(err, IsNil) - c.Assert(tableInfos, DeepEquals, []*model.TableInfo{ + require.NoError(t, err) + require.Equal(t, []*model.TableInfo{ { Name: model.NewCIStr("t"), State: model.StatePublic, @@ -385,12 +401,14 @@ func (s *mysqlSuite) TestFetchRemoteTableModels_4_x_auto_random(c *C) { }, }, }, - }) + }, tableInfos) } -func (s *mysqlSuite) TestWriteRowsErrorDowngrading(c *C) { +func TestWriteRowsErrorDowngrading(t *testing.T) { + t.Parallel() nonRetryableError := sql.ErrNoRows - + s := createMysqlSuite(t) + defer s.TearDownTest(t) // First, batch insert, fail and rollback. s.mockDB. ExpectExec("\\QINSERT INTO `foo`.`bar`(`a`) VALUES(1),(2),(3),(4),(5)\\E"). @@ -436,7 +454,7 @@ func (s *mysqlSuite) TestWriteRowsErrorDowngrading(c *C) { }), ) engine, err := ignoreBackend.OpenEngine(ctx, &backend.EngineConfig{}, "`foo`.`bar`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) dataRows := ignoreBackend.MakeEmptyRows() dataChecksum := verification.MakeKVChecksum(0, 0, 0) @@ -444,47 +462,47 @@ func (s *mysqlSuite) TestWriteRowsErrorDowngrading(c *C) { indexChecksum := verification.MakeKVChecksum(0, 0, 0) encoder, err := ignoreBackend.NewEncoder(s.tbl, &kv.SessionOptions{}) - c.Assert(err, IsNil) + require.NoError(t, err) row, err := encoder.Encode(logger, []types.Datum{ types.NewIntDatum(1), }, 1, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1}, "7.csv", 0) - c.Assert(err, IsNil) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) row, err = encoder.Encode(logger, []types.Datum{ types.NewIntDatum(2), }, 1, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1}, "8.csv", 0) - c.Assert(err, IsNil) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) row, err = encoder.Encode(logger, []types.Datum{ types.NewIntDatum(3), }, 1, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1}, "9.csv", 0) - c.Assert(err, IsNil) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) row, err = encoder.Encode(logger, []types.Datum{ types.NewIntDatum(4), }, 1, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1}, "10.csv", 0) - c.Assert(err, IsNil) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) row, err = encoder.Encode(logger, []types.Datum{ types.NewIntDatum(5), }, 1, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1}, "11.csv", 0) - c.Assert(err, IsNil) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) writer, err := engine.LocalWriter(ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, []string{"a"}, dataRows) - c.Assert(err, NotNil) + require.Error(t, err) st, err := writer.Close(ctx) - c.Assert(err, IsNil) - c.Assert(st, IsNil) + require.NoError(t, err) + require.Nil(t, st) }