From bb8b8cc1de5463239dd0ccd63fdb6ecbdff45901 Mon Sep 17 00:00:00 2001 From: zanpocc Date: Sat, 2 Apr 2022 21:42:29 +0800 Subject: [PATCH] executor: migrate test-infra to testify for executor_test.go testResourceTagSuite (#33603) close pingcap/tidb#33443 --- executor/executor_legacy_test.go | 197 ---------------------------- executor/resource_tag_test.go | 217 +++++++++++++++++++++++++++++++ 2 files changed, 217 insertions(+), 197 deletions(-) create mode 100644 executor/resource_tag_test.go diff --git a/executor/executor_legacy_test.go b/executor/executor_legacy_test.go index 1c7333ecfa..6ce595101f 100644 --- a/executor/executor_legacy_test.go +++ b/executor/executor_legacy_test.go @@ -62,8 +62,6 @@ import ( "github.com/pingcap/tidb/store/copr" error2 "github.com/pingcap/tidb/store/driver/error" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/unistore" - "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" testkit2 "github.com/pingcap/tidb/testkit" @@ -72,14 +70,12 @@ import ( "github.com/pingcap/tidb/util/admin" "github.com/pingcap/tidb/util/deadlockhistory" "github.com/pingcap/tidb/util/gcutil" - "github.com/pingcap/tidb/util/israce" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/rowcodec" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testleak" "github.com/pingcap/tidb/util/timeutil" - topsqlstate "github.com/pingcap/tidb/util/topsql/state" "github.com/pingcap/tipb/go-tipb" "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/oracle" @@ -113,7 +109,6 @@ var _ = SerialSuites(&testSerialSuite1{&baseTestSuite{}}) var _ = SerialSuites(&globalIndexSuite{&baseTestSuite{}}) var _ = SerialSuites(&testSerialSuite{&baseTestSuite{}}) var _ = SerialSuites(&testCoprCache{}) -var _ = SerialSuites(&testResourceTagSuite{&baseTestSuite{}}) type testSuite struct{ *baseTestSuite } type testSuiteP1 struct{ *baseTestSuite } @@ -126,7 +121,6 @@ type testCoprCache struct { dom *domain.Domain cls testutils.Cluster } -type testResourceTagSuite struct{ *baseTestSuite } // MockGC is used to make GC work in the test environment. func MockGC(tk *testkit.TestKit) (string, string, string, func()) { @@ -3275,16 +3269,6 @@ func (s *testSuiteP2) TestReadPartitionedTable(c *C) { tk.MustQuery("select a from pt where b = 3").Check(testkit.Rows("3")) } -func testGetTableByName(c *C, ctx sessionctx.Context, db, table string) table.Table { - dom := domain.GetDomain(ctx) - // Make sure the table schema is the new schema. - err := dom.Reload() - c.Assert(err, IsNil) - tbl, err := dom.InfoSchema().TableByName(model.NewCIStr(db), model.NewCIStr(table)) - c.Assert(err, IsNil) - return tbl -} - func (s *testSuiteP2) TestIssue10435(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -5616,187 +5600,6 @@ func (s testSerialSuite) TestExprBlackListForEnum(c *C) { c.Assert(checkFuncPushDown(rows, "index:idx(b, a)"), IsTrue) } -func (s *testResourceTagSuite) TestResourceGroupTag(c *C) { - if israce.RaceEnabled { - c.Skip("unstable, skip it and fix it before 20210622") - } - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t(a int, b int, unique index idx(a));") - tbInfo := testGetTableByName(c, tk.Se, "test", "t") - - // Enable Top SQL - topsqlstate.EnableTopSQL() - config.UpdateGlobal(func(conf *config.Config) { - conf.TopSQL.ReceiverAddress = "mock-agent" - }) - - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/unistoreRPCClientSendHook", `return(true)`), IsNil) - defer failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/unistoreRPCClientSendHook") - - var sqlDigest, planDigest *parser.Digest - var tagLabel tipb.ResourceGroupTagLabel - checkFn := func() {} - unistore.UnistoreRPCClientSendHook = func(req *tikvrpc.Request) { - var startKey []byte - var ctx *kvrpcpb.Context - switch req.Type { - case tikvrpc.CmdGet: - request := req.Get() - startKey = request.Key - ctx = request.Context - case tikvrpc.CmdBatchGet: - request := req.BatchGet() - startKey = request.Keys[0] - ctx = request.Context - case tikvrpc.CmdPrewrite: - request := req.Prewrite() - startKey = request.Mutations[0].Key - ctx = request.Context - case tikvrpc.CmdCommit: - request := req.Commit() - startKey = request.Keys[0] - ctx = request.Context - case tikvrpc.CmdCop: - request := req.Cop() - startKey = request.Ranges[0].Start - ctx = request.Context - case tikvrpc.CmdPessimisticLock: - request := req.PessimisticLock() - startKey = request.PrimaryLock - ctx = request.Context - } - tid := tablecodec.DecodeTableID(startKey) - if tid != tbInfo.Meta().ID { - return - } - if ctx == nil { - return - } - tag := &tipb.ResourceGroupTag{} - err := tag.Unmarshal(ctx.ResourceGroupTag) - c.Assert(err, IsNil) - sqlDigest = parser.NewDigest(tag.SqlDigest) - planDigest = parser.NewDigest(tag.PlanDigest) - tagLabel = *tag.Label - checkFn() - } - - resetVars := func() { - sqlDigest = parser.NewDigest(nil) - planDigest = parser.NewDigest(nil) - } - - cases := []struct { - sql string - tagLabels map[tipb.ResourceGroupTagLabel]struct{} - ignore bool - }{ - { - sql: "insert into t values(1,1),(2,2),(3,3)", - tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ - tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, - }, - }, - { - sql: "select * from t use index (idx) where a=1", - tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ - tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow: {}, - tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, - }, - }, - { - sql: "select * from t use index (idx) where a in (1,2,3)", - tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ - tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow: {}, - tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, - }, - }, - { - sql: "select * from t use index (idx) where a>1", - tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ - tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow: {}, - tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, - }, - }, - { - sql: "select * from t where b>1", - tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ - tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow: {}, - }, - }, - { - sql: "select a from t use index (idx) where a>1", - tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ - tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, - }, - }, - { - sql: "begin pessimistic", - ignore: true, - }, - { - sql: "insert into t values(4,4)", - tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ - tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow: {}, - tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, - }, - }, - { - sql: "commit", - ignore: true, - }, - { - sql: "update t set a=5,b=5 where a=5", - tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ - tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, - }, - }, - { - sql: "replace into t values(6,6)", - tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ - tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, - }, - }, - } - for _, ca := range cases { - resetVars() - commentf := Commentf("%v", ca.sql) - - _, expectSQLDigest := parser.NormalizeDigest(ca.sql) - var expectPlanDigest *parser.Digest - checkCnt := 0 - checkFn = func() { - if ca.ignore { - return - } - if expectPlanDigest == nil { - info := tk.Se.ShowProcess() - c.Assert(info, NotNil) - p, ok := info.Plan.(plannercore.Plan) - c.Assert(ok, IsTrue) - _, expectPlanDigest = plannercore.NormalizePlan(p) - } - c.Assert(sqlDigest.String(), Equals, expectSQLDigest.String(), commentf) - c.Assert(planDigest.String(), Equals, expectPlanDigest.String()) - _, ok := ca.tagLabels[tagLabel] - c.Assert(ok, Equals, true) - checkCnt++ - } - - if strings.HasPrefix(ca.sql, "select") { - tk.MustQuery(ca.sql) - } else { - tk.MustExec(ca.sql) - } - if ca.ignore { - continue - } - c.Assert(checkCnt > 0, IsTrue, commentf) - } -} - func (s *testSuite) TestIssue24933(c *C) { tk := testkit.NewTestKit(c, s.store) diff --git a/executor/resource_tag_test.go b/executor/resource_tag_test.go new file mode 100644 index 0000000000..605a7f323b --- /dev/null +++ b/executor/resource_tag_test.go @@ -0,0 +1,217 @@ +// Copyright 2022 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package executor_test + +import ( + "strings" + "testing" + + "github.com/pingcap/failpoint" + "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/parser" + plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/store/mockstore/unistore" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/external" + topsqlstate "github.com/pingcap/tidb/util/topsql/state" + "github.com/pingcap/tipb/go-tipb" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/tikvrpc" +) + +func TestResourceGroupTag(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int, b int, unique index idx(a));") + + tbInfo := external.GetTableByName(t, tk, "test", "t") + + // Enable Top SQL + topsqlstate.EnableTopSQL() + config.UpdateGlobal(func(conf *config.Config) { + conf.TopSQL.ReceiverAddress = "mock-agent" + }) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/unistoreRPCClientSendHook", `return(true)`)) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/unistoreRPCClientSendHook")) + }() + + var sqlDigest, planDigest *parser.Digest + var tagLabel tipb.ResourceGroupTagLabel + checkFn := func() {} + unistore.UnistoreRPCClientSendHook = func(req *tikvrpc.Request) { + var startKey []byte + var ctx *kvrpcpb.Context + switch req.Type { + case tikvrpc.CmdGet: + request := req.Get() + startKey = request.Key + ctx = request.Context + case tikvrpc.CmdBatchGet: + request := req.BatchGet() + startKey = request.Keys[0] + ctx = request.Context + case tikvrpc.CmdPrewrite: + request := req.Prewrite() + startKey = request.Mutations[0].Key + ctx = request.Context + case tikvrpc.CmdCommit: + request := req.Commit() + startKey = request.Keys[0] + ctx = request.Context + case tikvrpc.CmdCop: + request := req.Cop() + startKey = request.Ranges[0].Start + ctx = request.Context + case tikvrpc.CmdPessimisticLock: + request := req.PessimisticLock() + startKey = request.PrimaryLock + ctx = request.Context + } + tid := tablecodec.DecodeTableID(startKey) + if tid != tbInfo.Meta().ID { + return + } + if ctx == nil { + return + } + tag := &tipb.ResourceGroupTag{} + err := tag.Unmarshal(ctx.ResourceGroupTag) + require.NoError(t, err) + sqlDigest = parser.NewDigest(tag.SqlDigest) + planDigest = parser.NewDigest(tag.PlanDigest) + tagLabel = *tag.Label + checkFn() + } + + resetVars := func() { + sqlDigest = parser.NewDigest(nil) + planDigest = parser.NewDigest(nil) + } + + cases := []struct { + sql string + tagLabels map[tipb.ResourceGroupTagLabel]struct{} + ignore bool + }{ + { + sql: "insert into t values(1,1),(2,2),(3,3)", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, + { + sql: "select * from t use index (idx) where a=1", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow: {}, + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, + { + sql: "select * from t use index (idx) where a in (1,2,3)", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow: {}, + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, + { + sql: "select * from t use index (idx) where a>1", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow: {}, + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, + { + sql: "select * from t where b>1", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow: {}, + }, + }, + { + sql: "select a from t use index (idx) where a>1", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, + { + sql: "begin pessimistic", + ignore: true, + }, + { + sql: "insert into t values(4,4)", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow: {}, + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, + { + sql: "commit", + ignore: true, + }, + { + sql: "update t set a=5,b=5 where a=5", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, + { + sql: "replace into t values(6,6)", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, + } + for _, ca := range cases { + resetVars() + + _, expectSQLDigest := parser.NormalizeDigest(ca.sql) + var expectPlanDigest *parser.Digest + checkCnt := 0 + checkFn = func() { + if ca.ignore { + return + } + if expectPlanDigest == nil { + info := tk.Session().ShowProcess() + require.NotNil(t, info) + p, ok := info.Plan.(plannercore.Plan) + require.True(t, ok) + _, expectPlanDigest = plannercore.NormalizePlan(p) + } + require.Equal(t, sqlDigest.String(), expectSQLDigest.String(), "%v", ca.sql) + require.Equal(t, planDigest.String(), expectPlanDigest.String()) + _, ok := ca.tagLabels[tagLabel] + require.True(t, ok) + checkCnt++ + } + + if strings.HasPrefix(ca.sql, "select") { + tk.MustQuery(ca.sql) + } else { + tk.MustExec(ca.sql) + } + if ca.ignore { + continue + } + require.Greater(t, checkCnt, 0, "%v", ca.sql) + } +}