diff --git a/.github/workflows/pd-tests.yaml b/.github/workflows/pd-tests.yaml index 223187737e0..c2469d64a31 100644 --- a/.github/workflows/pd-tests.yaml +++ b/.github/workflows/pd-tests.yaml @@ -31,15 +31,23 @@ jobs: - worker_id: 2 name: 'Unit Test(2)' - worker_id: 3 - name: 'Tools Test' + name: 'Unit Test(3)' - worker_id: 4 - name: 'Client Integration Test' + name: 'Tests(1)' - worker_id: 5 - name: 'TSO Integration Test' + name: 'Tests(2)' - worker_id: 6 - name: 'MicroService Integration Test' + name: 'Tools Test' + - worker_id: 7 + name: 'Client Integration Test' + - worker_id: 8 + name: 'TSO Integration Test' + - worker_id: 9 + name: 'MicroService Integration(!TSO)' + - worker_id: 10 + name: 'MicroService Integration(TSO)' outputs: - job-total: 6 + job-total: 10 steps: - name: Checkout code uses: actions/checkout@v4 @@ -52,6 +60,9 @@ jobs: run: | make ci-test-job JOB_INDEX=$WORKER_ID mv covprofile covprofile_$WORKER_ID + if [ -f junitfile ]; then + cat junitfile + fi - name: Upload coverage result ${{ matrix.worker_id }} uses: actions/upload-artifact@v4 with: @@ -77,7 +88,7 @@ jobs: # only keep the first line(`mode: aomic`) of the coverage profile sed -i '2,${/mode: atomic/d;}' covprofile - name: Send coverage - uses: codecov/codecov-action@v4.2.0 + uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV }} file: ./covprofile diff --git a/.gitignore b/.gitignore index fb9f0424418..dc2efa5004f 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ docs/swagger/* *.before covprofile coverage.tmp +junitfile package.list report.xml coverage.xml diff --git a/Makefile b/Makefile index 5f5ac871f18..25628a13736 100644 --- a/Makefile +++ b/Makefile @@ -228,7 +228,7 @@ failpoint-disable: install-tools ut: pd-ut @$(FAILPOINT_ENABLE) # only run unit tests - ./bin/pd-ut run --ignore tests --race + ./bin/pd-ut run --ignore tests --race --junitfile ./junitfile @$(CLEAN_UT_BINARY) @$(FAILPOINT_DISABLE) diff --git a/pkg/core/region_test.go b/pkg/core/region_test.go index ce59c0075d0..816bba4efae 100644 --- a/pkg/core/region_test.go +++ b/pkg/core/region_test.go @@ -731,7 +731,7 @@ func BenchmarkRandomSetRegion(b *testing.B) { func TestGetRegionSizeByRange(t *testing.T) { regions := NewRegionsInfo() - nums := 1000010 + nums := 100001 for i := 0; i < nums; i++ { peer := &metapb.Peer{StoreId: 1, Id: uint64(i + 1)} endKey := []byte(fmt.Sprintf("%20d", i+1)) diff --git a/scripts/ci-subtask.sh b/scripts/ci-subtask.sh index 9bdce420d4a..1709b97f437 100755 --- a/scripts/ci-subtask.sh +++ b/scripts/ci-subtask.sh @@ -3,34 +3,51 @@ # ./ci-subtask.sh ROOT_PATH_COV=$(pwd)/covprofile +ROOT_PATH_JUNITFILE=$(pwd)/junitfile # Currently, we only have 3 integration tests, so we can hardcode the task index. integrations_dir=$(pwd)/tests/integrations case $1 in 1) - # unit tests ignore `tests` - ./bin/pd-ut run --race --ignore tests --coverprofile $ROOT_PATH_COV || exit 1 + # unit tests ignore `tests`, `server`, `schedule`,`utils` and `encryption` + ./bin/pd-ut run --ignore tests,server,pkg/schedule,pkg/utils,pkg/encryption --race --coverprofile $ROOT_PATH_COV --junitfile $ROOT_PATH_JUNITFILE || exit 1 ;; 2) - # unit tests only in `tests` - ./bin/pd-ut run tests --race --coverprofile $ROOT_PATH_COV || exit 1 + # unit tests only in `schedule` and `encryption` without `tests` + ./bin/pd-ut run schedule,encryption --ignore tests --race --coverprofile $ROOT_PATH_COV --junitfile $ROOT_PATH_JUNITFILE || exit 1 ;; 3) + # unit tests only in `server` and `utils` without `tests` + ./bin/pd-ut run server,utils --ignore tests --race --coverprofile $ROOT_PATH_COV --junitfile $ROOT_PATH_JUNITFILE || exit 1 + ;; + 4) + # tests only in `tests` without `server/api, server/cluster and `server/config` + ./bin/pd-ut run tests --ignore tests/server/api,tests/server/cluster,tests/server/config --race --coverprofile $ROOT_PATH_COV --junitfile $ROOT_PATH_JUNITFILE || exit 1 + ;; + 5) + # tests only in `server/api, server/cluster and `server/config` in `tests` + ./bin/pd-ut run tests/server/api,tests/server/cluster,tests/server/config --race --coverprofile $ROOT_PATH_COV --junitfile $ROOT_PATH_JUNITFILE || exit 1 + ;; + 6) # tools tests cd ./tools && make ci-test-job && cat covprofile >> $ROOT_PATH_COV || exit 1 ;; - 4) + 7) # integration test client - ./bin/pd-ut it run client --race --coverprofile $ROOT_PATH_COV || exit 1 + ./bin/pd-ut it run client --race --coverprofile $ROOT_PATH_COV --junitfile $ROOT_PATH_JUNITFILE || exit 1 # client tests cd ./client && make ci-test-job && cat covprofile >> $ROOT_PATH_COV || exit 1 ;; - 5) + 8) # integration test tso - ./bin/pd-ut it run tso --race --coverprofile $ROOT_PATH_COV || exit 1 + ./bin/pd-ut it run tso --race --ignore mcs/tso --coverprofile $ROOT_PATH_COV --junitfile $ROOT_PATH_JUNITFILE || exit 1 ;; - 6) - # integration test mcs - ./bin/pd-ut it run mcs --race --coverprofile $ROOT_PATH_COV || exit 1 + 9) + # integration test mcs without mcs/tso + ./bin/pd-ut it run mcs --race --ignore mcs/tso --coverprofile $ROOT_PATH_COV --junitfile $ROOT_PATH_JUNITFILE || exit 1 + ;; + 10) + # integration test mcs/tso + ./bin/pd-ut it run mcs/tso --race --coverprofile $ROOT_PATH_COV --junitfile $ROOT_PATH_JUNITFILE || exit 1 ;; esac diff --git a/server/api/region_test.go b/server/api/region_test.go index 88632232175..fb32496c16a 100644 --- a/server/api/region_test.go +++ b/server/api/region_test.go @@ -333,7 +333,7 @@ func TestRegionsWithKillRequest(t *testing.T) { url := fmt.Sprintf("%s%s/api/v1/regions", addr, apiPrefix) mustBootstrapCluster(re, svr) - regionCount := 100000 + regionCount := 10000 tu.GenerateTestDataConcurrently(regionCount, func(i int) { r := core.NewTestRegionInfo(uint64(i+2), 1, []byte(fmt.Sprintf("%09d", i)), diff --git a/tests/integrations/client/client_test.go b/tests/integrations/client/client_test.go index e2d34f2c96f..07824c5483a 100644 --- a/tests/integrations/client/client_test.go +++ b/tests/integrations/client/client_test.go @@ -217,7 +217,7 @@ func TestLeaderTransferAndMoveCluster(t *testing.T) { }() // Transfer leader. - for i := 0; i < 5; i++ { + for i := 0; i < 3; i++ { oldLeaderName := cluster.WaitLeader() err := cluster.GetServer(oldLeaderName).ResignLeader() re.NoError(err) diff --git a/tests/integrations/mcs/scheduling/api_test.go b/tests/integrations/mcs/scheduling/api_test.go index 365ab1ca493..eba94213d7e 100644 --- a/tests/integrations/mcs/scheduling/api_test.go +++ b/tests/integrations/mcs/scheduling/api_test.go @@ -514,7 +514,7 @@ func (suite *apiTestSuite) checkAdminRegionCacheForward(cluster *tests.TestClust } func (suite *apiTestSuite) TestFollowerForward() { - suite.env.RunTestInTwoModes(suite.checkFollowerForward) + suite.env.RunTestBasedOnMode(suite.checkFollowerForward) } func (suite *apiTestSuite) checkFollowerForward(cluster *tests.TestCluster) { diff --git a/tests/integrations/mcs/tso/keyspace_group_manager_test.go b/tests/integrations/mcs/tso/keyspace_group_manager_test.go index 6d861962d9b..31aa5ee704e 100644 --- a/tests/integrations/mcs/tso/keyspace_group_manager_test.go +++ b/tests/integrations/mcs/tso/keyspace_group_manager_test.go @@ -67,7 +67,7 @@ func (suite *tsoKeyspaceGroupManagerTestSuite) allocID() uint32 { return uint32(id) } -func TestTSOKeyspaceGroupManager(t *testing.T) { +func TestTSOKeyspaceGroupManagerSuite(t *testing.T) { suite.Run(t, &tsoKeyspaceGroupManagerTestSuite{}) } diff --git a/tests/integrations/mcs/tso/server_test.go b/tests/integrations/mcs/tso/server_test.go index 260395e4209..29d396b3d2e 100644 --- a/tests/integrations/mcs/tso/server_test.go +++ b/tests/integrations/mcs/tso/server_test.go @@ -260,8 +260,8 @@ func TestWaitAPIServiceReady(t *testing.T) { } } -type APIServerForwardTestSuite struct { - suite.Suite +type APIServerForward struct { + re *require.Assertions ctx context.Context cancel context.CancelFunc cluster *tests.TestCluster @@ -270,13 +270,11 @@ type APIServerForwardTestSuite struct { pdClient pd.Client } -func TestAPIServerForwardTestSuite(t *testing.T) { - suite.Run(t, new(APIServerForwardTestSuite)) -} - -func (suite *APIServerForwardTestSuite) SetupTest() { +func NewAPIServerForward(re *require.Assertions) APIServerForward { + suite := APIServerForward{ + re: re, + } var err error - re := suite.Require() suite.ctx, suite.cancel = context.WithCancel(context.Background()) suite.cluster, err = tests.NewTestAPICluster(suite.ctx, 3) re.NoError(err) @@ -294,11 +292,12 @@ func (suite *APIServerForwardTestSuite) SetupTest() { suite.pdClient, err = pd.NewClientWithContext(context.Background(), []string{suite.backendEndpoints}, pd.SecurityOption{}, pd.WithMaxErrorRetry(1)) re.NoError(err) + return suite } -func (suite *APIServerForwardTestSuite) TearDownTest() { - re := suite.Require() +func (suite *APIServerForward) ShutDown() { suite.pdClient.Close() + re := suite.re etcdClient := suite.pdLeader.GetEtcdClient() clusterID := strconv.FormatUint(suite.pdLeader.GetClusterID(), 10) @@ -314,8 +313,10 @@ func (suite *APIServerForwardTestSuite) TearDownTest() { re.NoError(failpoint.Disable("github.com/tikv/pd/client/usePDServiceMode")) } -func (suite *APIServerForwardTestSuite) TestForwardTSORelated() { - re := suite.Require() +func TestForwardTSORelated(t *testing.T) { + re := require.New(t) + suite := NewAPIServerForward(re) + defer suite.ShutDown() // Unable to use the tso-related interface without tso server suite.checkUnavailableTSO(re) tc, err := tests.NewTestTSOCluster(suite.ctx, 1, suite.backendEndpoints) @@ -325,8 +326,10 @@ func (suite *APIServerForwardTestSuite) TestForwardTSORelated() { suite.checkAvailableTSO(re) } -func (suite *APIServerForwardTestSuite) TestForwardTSOWhenPrimaryChanged() { - re := suite.Require() +func TestForwardTSOWhenPrimaryChanged(t *testing.T) { + re := require.New(t) + suite := NewAPIServerForward(re) + defer suite.ShutDown() tc, err := tests.NewTestTSOCluster(suite.ctx, 2, suite.backendEndpoints) re.NoError(err) @@ -363,10 +366,11 @@ func (suite *APIServerForwardTestSuite) TestForwardTSOWhenPrimaryChanged() { suite.checkAvailableTSO(re) } -func (suite *APIServerForwardTestSuite) TestResignTSOPrimaryForward() { +func TestResignTSOPrimaryForward(t *testing.T) { + re := require.New(t) + suite := NewAPIServerForward(re) + defer suite.ShutDown() // TODO: test random kill primary with 3 nodes - re := suite.Require() - tc, err := tests.NewTestTSOCluster(suite.ctx, 2, suite.backendEndpoints) re.NoError(err) defer tc.Destroy() @@ -388,8 +392,10 @@ func (suite *APIServerForwardTestSuite) TestResignTSOPrimaryForward() { } } -func (suite *APIServerForwardTestSuite) TestResignAPIPrimaryForward() { - re := suite.Require() +func TestResignAPIPrimaryForward(t *testing.T) { + re := require.New(t) + suite := NewAPIServerForward(re) + defer suite.ShutDown() tc, err := tests.NewTestTSOCluster(suite.ctx, 2, suite.backendEndpoints) re.NoError(err) @@ -410,8 +416,10 @@ func (suite *APIServerForwardTestSuite) TestResignAPIPrimaryForward() { } } -func (suite *APIServerForwardTestSuite) TestForwardTSOUnexpectedToFollower1() { - re := suite.Require() +func TestForwardTSOUnexpectedToFollower1(t *testing.T) { + re := require.New(t) + suite := NewAPIServerForward(re) + defer suite.ShutDown() suite.checkForwardTSOUnexpectedToFollower(func() { // unary call will retry internally // try to update gc safe point @@ -421,8 +429,10 @@ func (suite *APIServerForwardTestSuite) TestForwardTSOUnexpectedToFollower1() { }) } -func (suite *APIServerForwardTestSuite) TestForwardTSOUnexpectedToFollower2() { - re := suite.Require() +func TestForwardTSOUnexpectedToFollower2(t *testing.T) { + re := require.New(t) + suite := NewAPIServerForward(re) + defer suite.ShutDown() suite.checkForwardTSOUnexpectedToFollower(func() { // unary call will retry internally // try to set external ts @@ -433,16 +443,18 @@ func (suite *APIServerForwardTestSuite) TestForwardTSOUnexpectedToFollower2() { }) } -func (suite *APIServerForwardTestSuite) TestForwardTSOUnexpectedToFollower3() { - re := suite.Require() +func TestForwardTSOUnexpectedToFollower3(t *testing.T) { + re := require.New(t) + suite := NewAPIServerForward(re) + defer suite.ShutDown() suite.checkForwardTSOUnexpectedToFollower(func() { _, _, err := suite.pdClient.GetTS(suite.ctx) re.Error(err) }) } -func (suite *APIServerForwardTestSuite) checkForwardTSOUnexpectedToFollower(checkTSO func()) { - re := suite.Require() +func (suite *APIServerForward) checkForwardTSOUnexpectedToFollower(checkTSO func()) { + re := suite.re tc, err := tests.NewTestTSOCluster(suite.ctx, 2, suite.backendEndpoints) re.NoError(err) tc.WaitForDefaultPrimaryServing(re) @@ -477,7 +489,7 @@ func (suite *APIServerForwardTestSuite) checkForwardTSOUnexpectedToFollower(chec tc.Destroy() } -func (suite *APIServerForwardTestSuite) addRegions() { +func (suite *APIServerForward) addRegions() { leader := suite.cluster.GetServer(suite.cluster.WaitLeader()) rc := leader.GetServer().GetRaftCluster() for i := 0; i < 3; i++ { @@ -491,7 +503,7 @@ func (suite *APIServerForwardTestSuite) addRegions() { } } -func (suite *APIServerForwardTestSuite) checkUnavailableTSO(re *require.Assertions) { +func (suite *APIServerForward) checkUnavailableTSO(re *require.Assertions) { _, _, err := suite.pdClient.GetTS(suite.ctx) re.Error(err) // try to update gc safe point @@ -502,7 +514,7 @@ func (suite *APIServerForwardTestSuite) checkUnavailableTSO(re *require.Assertio re.Error(err) } -func (suite *APIServerForwardTestSuite) checkAvailableTSO(re *require.Assertions) { +func (suite *APIServerForward) checkAvailableTSO(re *require.Assertions) { mcs.WaitForTSOServiceAvailable(suite.ctx, re, suite.pdClient) // try to get ts _, _, err := suite.pdClient.GetTS(suite.ctx) diff --git a/tests/integrations/tso/client_test.go b/tests/integrations/tso/client_test.go index d4f484087cf..f229c4782bb 100644 --- a/tests/integrations/tso/client_test.go +++ b/tests/integrations/tso/client_test.go @@ -71,13 +71,13 @@ func (suite *tsoClientTestSuite) getBackendEndpoints() []string { return strings.Split(suite.backendEndpoints, ",") } -func TestLegacyTSOClient(t *testing.T) { +func TestLegacyTSOClientSuite(t *testing.T) { suite.Run(t, &tsoClientTestSuite{ legacy: true, }) } -func TestMicroserviceTSOClient(t *testing.T) { +func TestMicroserviceTSOClientSuite(t *testing.T) { suite.Run(t, &tsoClientTestSuite{ legacy: false, }) diff --git a/tests/integrations/tso/consistency_test.go b/tests/integrations/tso/consistency_test.go index 4d05c47225a..37c1441bc80 100644 --- a/tests/integrations/tso/consistency_test.go +++ b/tests/integrations/tso/consistency_test.go @@ -53,13 +53,13 @@ type tsoConsistencyTestSuite struct { tsoClient tsopb.TSOClient } -func TestLegacyTSOConsistency(t *testing.T) { +func TestLegacyTSOConsistencySuite(t *testing.T) { suite.Run(t, &tsoConsistencyTestSuite{ legacy: true, }) } -func TestMicroserviceTSOConsistency(t *testing.T) { +func TestMicroserviceTSOConsistencySuite(t *testing.T) { suite.Run(t, &tsoConsistencyTestSuite{ legacy: false, }) diff --git a/tests/server/api/checker_test.go b/tests/server/api/checker_test.go index 54298b405f1..190e02ce607 100644 --- a/tests/server/api/checker_test.go +++ b/tests/server/api/checker_test.go @@ -44,7 +44,7 @@ func (suite *checkerTestSuite) TearDownSuite() { } func (suite *checkerTestSuite) TestAPI() { - suite.env.RunTestInTwoModes(suite.checkAPI) + suite.env.RunTestBasedOnMode(suite.checkAPI) } func (suite *checkerTestSuite) checkAPI(cluster *tests.TestCluster) { diff --git a/tests/server/api/operator_test.go b/tests/server/api/operator_test.go index c3b86f9fde0..857ea6b3cdd 100644 --- a/tests/server/api/operator_test.go +++ b/tests/server/api/operator_test.go @@ -55,7 +55,7 @@ func (suite *operatorTestSuite) TearDownSuite() { } func (suite *operatorTestSuite) TestAddRemovePeer() { - suite.env.RunTestInTwoModes(suite.checkAddRemovePeer) + suite.env.RunTestBasedOnMode(suite.checkAddRemovePeer) } func (suite *operatorTestSuite) checkAddRemovePeer(cluster *tests.TestCluster) { @@ -165,7 +165,7 @@ func (suite *operatorTestSuite) checkAddRemovePeer(cluster *tests.TestCluster) { } func (suite *operatorTestSuite) TestMergeRegionOperator() { - suite.env.RunTestInTwoModes(suite.checkMergeRegionOperator) + suite.env.RunTestBasedOnMode(suite.checkMergeRegionOperator) } func (suite *operatorTestSuite) checkMergeRegionOperator(cluster *tests.TestCluster) { @@ -225,7 +225,7 @@ func (suite *operatorTestSuite) TestTransferRegionWithPlacementRule() { func(conf *config.Config, _ string) { conf.Replication.MaxReplicas = 3 }) - env.RunTestInTwoModes(suite.checkTransferRegionWithPlacementRule) + env.RunTestBasedOnMode(suite.checkTransferRegionWithPlacementRule) env.Cleanup() } @@ -505,7 +505,7 @@ func (suite *operatorTestSuite) TestGetOperatorsAsObject() { func(conf *config.Config, _ string) { conf.Replication.MaxReplicas = 1 }) - env.RunTestInTwoModes(suite.checkGetOperatorsAsObject) + env.RunTestBasedOnMode(suite.checkGetOperatorsAsObject) env.Cleanup() } @@ -602,7 +602,7 @@ func (suite *operatorTestSuite) checkGetOperatorsAsObject(cluster *tests.TestClu } func (suite *operatorTestSuite) TestRemoveOperators() { - suite.env.RunTestInTwoModes(suite.checkRemoveOperators) + suite.env.RunTestBasedOnMode(suite.checkRemoveOperators) } func (suite *operatorTestSuite) checkRemoveOperators(cluster *tests.TestCluster) { diff --git a/tests/server/api/region_test.go b/tests/server/api/region_test.go index 23ebceaefd6..af114b18473 100644 --- a/tests/server/api/region_test.go +++ b/tests/server/api/region_test.go @@ -97,7 +97,7 @@ func (suite *regionTestSuite) TearDownTest() { func (suite *regionTestSuite) TestSplitRegions() { // use a new environment to avoid affecting other tests env := tests.NewSchedulingTestEnvironment(suite.T()) - env.RunTestInTwoModes(suite.checkSplitRegions) + env.RunTestBasedOnMode(suite.checkSplitRegions) env.Cleanup() } @@ -138,7 +138,7 @@ func (suite *regionTestSuite) checkSplitRegions(cluster *tests.TestCluster) { } func (suite *regionTestSuite) TestAccelerateRegionsScheduleInRange() { - suite.env.RunTestInTwoModes(suite.checkAccelerateRegionsScheduleInRange) + suite.env.RunTestBasedOnMode(suite.checkAccelerateRegionsScheduleInRange) } func (suite *regionTestSuite) checkAccelerateRegionsScheduleInRange(cluster *tests.TestCluster) { @@ -173,7 +173,7 @@ func (suite *regionTestSuite) checkAccelerateRegionsScheduleInRange(cluster *tes } func (suite *regionTestSuite) TestAccelerateRegionsScheduleInRanges() { - suite.env.RunTestInTwoModes(suite.checkAccelerateRegionsScheduleInRanges) + suite.env.RunTestBasedOnMode(suite.checkAccelerateRegionsScheduleInRanges) } func (suite *regionTestSuite) checkAccelerateRegionsScheduleInRanges(cluster *tests.TestCluster) { @@ -211,7 +211,7 @@ func (suite *regionTestSuite) checkAccelerateRegionsScheduleInRanges(cluster *te func (suite *regionTestSuite) TestScatterRegions() { // use a new environment to avoid affecting other tests env := tests.NewSchedulingTestEnvironment(suite.T()) - env.RunTestInTwoModes(suite.checkScatterRegions) + env.RunTestBasedOnMode(suite.checkScatterRegions) env.Cleanup() } @@ -258,7 +258,7 @@ func (suite *regionTestSuite) checkScatterRegions(cluster *tests.TestCluster) { } func (suite *regionTestSuite) TestCheckRegionsReplicated() { - suite.env.RunTestInTwoModes(suite.checkRegionsReplicated) + suite.env.RunTestBasedOnMode(suite.checkRegionsReplicated) } func (suite *regionTestSuite) checkRegionsReplicated(cluster *tests.TestCluster) { diff --git a/tests/server/api/rule_test.go b/tests/server/api/rule_test.go index 16077a308f6..2cbabe16d0f 100644 --- a/tests/server/api/rule_test.go +++ b/tests/server/api/rule_test.go @@ -78,7 +78,7 @@ func (suite *ruleTestSuite) TearDownTest() { } func (suite *ruleTestSuite) TestSet() { - suite.env.RunTestInTwoModes(suite.checkSet) + suite.env.RunTestBasedOnMode(suite.checkSet) } func (suite *ruleTestSuite) checkSet(cluster *tests.TestCluster) { @@ -194,7 +194,7 @@ func (suite *ruleTestSuite) checkSet(cluster *tests.TestCluster) { } func (suite *ruleTestSuite) TestGet() { - suite.env.RunTestInTwoModes(suite.checkGet) + suite.env.RunTestBasedOnMode(suite.checkGet) } func (suite *ruleTestSuite) checkGet(cluster *tests.TestCluster) { @@ -245,7 +245,7 @@ func (suite *ruleTestSuite) checkGet(cluster *tests.TestCluster) { } func (suite *ruleTestSuite) TestGetAll() { - suite.env.RunTestInTwoModes(suite.checkGetAll) + suite.env.RunTestBasedOnMode(suite.checkGetAll) } func (suite *ruleTestSuite) checkGetAll(cluster *tests.TestCluster) { @@ -267,7 +267,7 @@ func (suite *ruleTestSuite) checkGetAll(cluster *tests.TestCluster) { } func (suite *ruleTestSuite) TestSetAll() { - suite.env.RunTestInTwoModes(suite.checkSetAll) + suite.env.RunTestBasedOnMode(suite.checkSetAll) } func (suite *ruleTestSuite) checkSetAll(cluster *tests.TestCluster) { @@ -383,7 +383,7 @@ func (suite *ruleTestSuite) checkSetAll(cluster *tests.TestCluster) { } func (suite *ruleTestSuite) TestGetAllByGroup() { - suite.env.RunTestInTwoModes(suite.checkGetAllByGroup) + suite.env.RunTestBasedOnMode(suite.checkGetAllByGroup) } func (suite *ruleTestSuite) checkGetAllByGroup(cluster *tests.TestCluster) { @@ -440,7 +440,7 @@ func (suite *ruleTestSuite) checkGetAllByGroup(cluster *tests.TestCluster) { } func (suite *ruleTestSuite) TestGetAllByRegion() { - suite.env.RunTestInTwoModes(suite.checkGetAllByRegion) + suite.env.RunTestBasedOnMode(suite.checkGetAllByRegion) } func (suite *ruleTestSuite) checkGetAllByRegion(cluster *tests.TestCluster) { @@ -505,7 +505,7 @@ func (suite *ruleTestSuite) checkGetAllByRegion(cluster *tests.TestCluster) { } func (suite *ruleTestSuite) TestGetAllByKey() { - suite.env.RunTestInTwoModes(suite.checkGetAllByKey) + suite.env.RunTestBasedOnMode(suite.checkGetAllByKey) } func (suite *ruleTestSuite) checkGetAllByKey(cluster *tests.TestCluster) { @@ -564,7 +564,7 @@ func (suite *ruleTestSuite) checkGetAllByKey(cluster *tests.TestCluster) { } func (suite *ruleTestSuite) TestDelete() { - suite.env.RunTestInTwoModes(suite.checkDelete) + suite.env.RunTestBasedOnMode(suite.checkDelete) } func (suite *ruleTestSuite) checkDelete(cluster *tests.TestCluster) { @@ -630,7 +630,7 @@ func (suite *ruleTestSuite) checkDelete(cluster *tests.TestCluster) { } func (suite *ruleTestSuite) TestBatch() { - suite.env.RunTestInTwoModes(suite.checkBatch) + suite.env.RunTestBasedOnMode(suite.checkBatch) } func (suite *ruleTestSuite) checkBatch(cluster *tests.TestCluster) { @@ -759,7 +759,7 @@ func (suite *ruleTestSuite) checkBatch(cluster *tests.TestCluster) { } func (suite *ruleTestSuite) TestBundle() { - suite.env.RunTestInTwoModes(suite.checkBundle) + suite.env.RunTestBasedOnMode(suite.checkBundle) } func (suite *ruleTestSuite) checkBundle(cluster *tests.TestCluster) { @@ -869,7 +869,7 @@ func (suite *ruleTestSuite) checkBundle(cluster *tests.TestCluster) { } func (suite *ruleTestSuite) TestBundleBadRequest() { - suite.env.RunTestInTwoModes(suite.checkBundleBadRequest) + suite.env.RunTestBasedOnMode(suite.checkBundleBadRequest) } func (suite *ruleTestSuite) checkBundleBadRequest(cluster *tests.TestCluster) { @@ -900,7 +900,7 @@ func (suite *ruleTestSuite) checkBundleBadRequest(cluster *tests.TestCluster) { } func (suite *ruleTestSuite) TestLeaderAndVoter() { - suite.env.RunTestInTwoModes(suite.checkLeaderAndVoter) + suite.env.RunTestBasedOnMode(suite.checkLeaderAndVoter) } func (suite *ruleTestSuite) checkLeaderAndVoter(cluster *tests.TestCluster) { @@ -997,7 +997,7 @@ func (suite *ruleTestSuite) checkLeaderAndVoter(cluster *tests.TestCluster) { } func (suite *ruleTestSuite) TestDeleteAndUpdate() { - suite.env.RunTestInTwoModes(suite.checkDeleteAndUpdate) + suite.env.RunTestBasedOnMode(suite.checkDeleteAndUpdate) } func (suite *ruleTestSuite) checkDeleteAndUpdate(cluster *tests.TestCluster) { @@ -1078,7 +1078,7 @@ func (suite *ruleTestSuite) checkDeleteAndUpdate(cluster *tests.TestCluster) { } func (suite *ruleTestSuite) TestConcurrency() { - suite.env.RunTestInTwoModes(suite.checkConcurrency) + suite.env.RunTestBasedOnMode(suite.checkConcurrency) } func (suite *ruleTestSuite) checkConcurrency(cluster *tests.TestCluster) { @@ -1167,7 +1167,7 @@ func (suite *ruleTestSuite) checkConcurrencyWith(cluster *tests.TestCluster, } func (suite *ruleTestSuite) TestLargeRules() { - suite.env.RunTestInTwoModes(suite.checkLargeRules) + suite.env.RunTestBasedOnMode(suite.checkLargeRules) } func (suite *ruleTestSuite) checkLargeRules(cluster *tests.TestCluster) { @@ -1296,7 +1296,7 @@ func (suite *regionRuleTestSuite) TearDownSuite() { } func (suite *regionRuleTestSuite) TestRegionPlacementRule() { - suite.env.RunTestInTwoModes(suite.checkRegionPlacementRule) + suite.env.RunTestBasedOnMode(suite.checkRegionPlacementRule) } func (suite *regionRuleTestSuite) checkRegionPlacementRule(cluster *tests.TestCluster) { diff --git a/tests/server/api/scheduler_test.go b/tests/server/api/scheduler_test.go index 10631dab158..62b7db9d958 100644 --- a/tests/server/api/scheduler_test.go +++ b/tests/server/api/scheduler_test.go @@ -40,11 +40,20 @@ const apiPrefix = "/pd" type scheduleTestSuite struct { suite.Suite - env *tests.SchedulingTestEnvironment + env *tests.SchedulingTestEnvironment + runMode tests.SchedulerMode } -func TestScheduleTestSuite(t *testing.T) { - suite.Run(t, new(scheduleTestSuite)) +func TestPDSchedulingTestSuite(t *testing.T) { + suite.Run(t, &scheduleTestSuite{ + runMode: tests.PDMode, + }) +} + +func TestAPISchedulingTestSuite(t *testing.T) { + suite.Run(t, &scheduleTestSuite{ + runMode: tests.APIMode, + }) } func (suite *scheduleTestSuite) SetupSuite() { @@ -52,6 +61,7 @@ func (suite *scheduleTestSuite) SetupSuite() { re.NoError(failpoint.Enable("github.com/tikv/pd/pkg/schedule/changeCoordinatorTicker", `return(true)`)) re.NoError(failpoint.Enable("github.com/tikv/pd/server/cluster/skipStoreConfigSync", `return(true)`)) suite.env = tests.NewSchedulingTestEnvironment(suite.T()) + suite.env.RunMode = suite.runMode } func (suite *scheduleTestSuite) TearDownSuite() { @@ -62,7 +72,7 @@ func (suite *scheduleTestSuite) TearDownSuite() { } func (suite *scheduleTestSuite) TestOriginAPI() { - suite.env.RunTestInTwoModes(suite.checkOriginAPI) + suite.env.RunTestBasedOnMode(suite.checkOriginAPI) } func (suite *scheduleTestSuite) checkOriginAPI(cluster *tests.TestCluster) { @@ -130,7 +140,7 @@ func (suite *scheduleTestSuite) checkOriginAPI(cluster *tests.TestCluster) { } func (suite *scheduleTestSuite) TestAPI() { - suite.env.RunTestInTwoModes(suite.checkAPI) + suite.env.RunTestBasedOnMode(suite.checkAPI) } func (suite *scheduleTestSuite) checkAPI(cluster *tests.TestCluster) { @@ -616,7 +626,7 @@ func (suite *scheduleTestSuite) checkAPI(cluster *tests.TestCluster) { } func (suite *scheduleTestSuite) TestDisable() { - suite.env.RunTestInTwoModes(suite.checkDisable) + suite.env.RunTestBasedOnMode(suite.checkDisable) } func (suite *scheduleTestSuite) checkDisable(cluster *tests.TestCluster) { @@ -724,7 +734,7 @@ func (suite *scheduleTestSuite) testPauseOrResume(re *require.Assertions, urlPre } func (suite *scheduleTestSuite) TestEmptySchedulers() { - suite.env.RunTestInTwoModes(suite.checkEmptySchedulers) + suite.env.RunTestBasedOnMode(suite.checkEmptySchedulers) } func (suite *scheduleTestSuite) checkEmptySchedulers(cluster *tests.TestCluster) { diff --git a/tests/server/config/config_test.go b/tests/server/config/config_test.go index 67d7478caa0..b5d5b044f12 100644 --- a/tests/server/config/config_test.go +++ b/tests/server/config/config_test.go @@ -91,7 +91,7 @@ func (suite *configTestSuite) TearDownSuite() { } func (suite *configTestSuite) TestConfigAll() { - suite.env.RunTestInTwoModes(suite.checkConfigAll) + suite.env.RunTestBasedOnMode(suite.checkConfigAll) } func (suite *configTestSuite) checkConfigAll(cluster *tests.TestCluster) { @@ -212,7 +212,7 @@ func (suite *configTestSuite) checkConfigAll(cluster *tests.TestCluster) { } func (suite *configTestSuite) TestConfigSchedule() { - suite.env.RunTestInTwoModes(suite.checkConfigSchedule) + suite.env.RunTestBasedOnMode(suite.checkConfigSchedule) } func (suite *configTestSuite) checkConfigSchedule(cluster *tests.TestCluster) { @@ -238,7 +238,7 @@ func (suite *configTestSuite) checkConfigSchedule(cluster *tests.TestCluster) { } func (suite *configTestSuite) TestConfigReplication() { - suite.env.RunTestInTwoModes(suite.checkConfigReplication) + suite.env.RunTestBasedOnMode(suite.checkConfigReplication) } func (suite *configTestSuite) checkConfigReplication(cluster *tests.TestCluster) { @@ -281,7 +281,7 @@ func (suite *configTestSuite) checkConfigReplication(cluster *tests.TestCluster) } func (suite *configTestSuite) TestConfigLabelProperty() { - suite.env.RunTestInTwoModes(suite.checkConfigLabelProperty) + suite.env.RunTestBasedOnMode(suite.checkConfigLabelProperty) } func (suite *configTestSuite) checkConfigLabelProperty(cluster *tests.TestCluster) { @@ -333,7 +333,7 @@ func (suite *configTestSuite) checkConfigLabelProperty(cluster *tests.TestCluste } func (suite *configTestSuite) TestConfigDefault() { - suite.env.RunTestInTwoModes(suite.checkConfigDefault) + suite.env.RunTestBasedOnMode(suite.checkConfigDefault) } func (suite *configTestSuite) checkConfigDefault(cluster *tests.TestCluster) { @@ -377,7 +377,7 @@ func (suite *configTestSuite) checkConfigDefault(cluster *tests.TestCluster) { } func (suite *configTestSuite) TestConfigPDServer() { - suite.env.RunTestInTwoModes(suite.checkConfigPDServer) + suite.env.RunTestBasedOnMode(suite.checkConfigPDServer) } func (suite *configTestSuite) checkConfigPDServer(cluster *tests.TestCluster) { @@ -507,7 +507,7 @@ func createTTLUrl(url string, ttl int) string { } func (suite *configTestSuite) TestConfigTTL() { - suite.env.RunTestInTwoModes(suite.checkConfigTTL) + suite.env.RunTestBasedOnMode(suite.checkConfigTTL) } func (suite *configTestSuite) checkConfigTTL(cluster *tests.TestCluster) { @@ -568,7 +568,7 @@ func (suite *configTestSuite) checkConfigTTL(cluster *tests.TestCluster) { } func (suite *configTestSuite) TestTTLConflict() { - suite.env.RunTestInTwoModes(suite.checkTTLConflict) + suite.env.RunTestBasedOnMode(suite.checkTTLConflict) } func (suite *configTestSuite) checkTTLConflict(cluster *tests.TestCluster) { diff --git a/tests/testutil.go b/tests/testutil.go index 554def91f08..2fc87298d07 100644 --- a/tests/testutil.go +++ b/tests/testutil.go @@ -283,19 +283,21 @@ func MustReportBuckets(re *require.Assertions, cluster *TestCluster, regionID ui return buckets } -type mode int +type SchedulerMode int const ( - pdMode mode = iota - apiMode + Both SchedulerMode = iota + PDMode + APIMode ) // SchedulingTestEnvironment is used for test purpose. type SchedulingTestEnvironment struct { t *testing.T opts []ConfigOption - clusters map[mode]*TestCluster + clusters map[SchedulerMode]*TestCluster cancels []context.CancelFunc + RunMode SchedulerMode } // NewSchedulingTestEnvironment is to create a new SchedulingTestEnvironment. @@ -303,30 +305,38 @@ func NewSchedulingTestEnvironment(t *testing.T, opts ...ConfigOption) *Schedulin return &SchedulingTestEnvironment{ t: t, opts: opts, - clusters: make(map[mode]*TestCluster), + clusters: make(map[SchedulerMode]*TestCluster), cancels: make([]context.CancelFunc, 0), } } -// RunTestInTwoModes is to run test in two modes. -func (s *SchedulingTestEnvironment) RunTestInTwoModes(test func(*TestCluster)) { - s.RunTestInPDMode(test) - s.RunTestInAPIMode(test) +// RunTestBasedOnMode runs test based on mode. +// If mode not set, it will run test in both PD mode and API mode. +func (s *SchedulingTestEnvironment) RunTestBasedOnMode(test func(*TestCluster)) { + switch s.RunMode { + case PDMode: + s.RunTestInPDMode(test) + case APIMode: + s.RunTestInAPIMode(test) + default: + s.RunTestInPDMode(test) + s.RunTestInAPIMode(test) + } } // RunTestInPDMode is to run test in pd mode. func (s *SchedulingTestEnvironment) RunTestInPDMode(test func(*TestCluster)) { s.t.Logf("start test %s in pd mode", getTestName()) - if _, ok := s.clusters[pdMode]; !ok { - s.startCluster(pdMode) + if _, ok := s.clusters[PDMode]; !ok { + s.startCluster(PDMode) } - test(s.clusters[pdMode]) + test(s.clusters[PDMode]) } func getTestName() string { pc, _, _, _ := runtime.Caller(2) caller := runtime.FuncForPC(pc) - if caller == nil || strings.Contains(caller.Name(), "RunTestInTwoModes") { + if caller == nil || strings.Contains(caller.Name(), "RunTestBasedOnMode") { pc, _, _, _ = runtime.Caller(3) caller = runtime.FuncForPC(pc) } @@ -347,18 +357,18 @@ func (s *SchedulingTestEnvironment) RunTestInAPIMode(test func(*TestCluster)) { re.NoError(failpoint.Disable("github.com/tikv/pd/server/cluster/highFrequencyClusterJobs")) }() s.t.Logf("start test %s in api mode", getTestName()) - if _, ok := s.clusters[apiMode]; !ok { - s.startCluster(apiMode) + if _, ok := s.clusters[APIMode]; !ok { + s.startCluster(APIMode) } - test(s.clusters[apiMode]) + test(s.clusters[APIMode]) } // RunFuncInTwoModes is to run func in two modes. func (s *SchedulingTestEnvironment) RunFuncInTwoModes(f func(*TestCluster)) { - if c, ok := s.clusters[pdMode]; ok { + if c, ok := s.clusters[PDMode]; ok { f(c) } - if c, ok := s.clusters[apiMode]; ok { + if c, ok := s.clusters[APIMode]; ok { f(c) } } @@ -373,12 +383,12 @@ func (s *SchedulingTestEnvironment) Cleanup() { } } -func (s *SchedulingTestEnvironment) startCluster(m mode) { +func (s *SchedulingTestEnvironment) startCluster(m SchedulerMode) { re := require.New(s.t) ctx, cancel := context.WithCancel(context.Background()) s.cancels = append(s.cancels, cancel) switch m { - case pdMode: + case PDMode: cluster, err := NewTestCluster(ctx, 1, s.opts...) re.NoError(err) err = cluster.RunInitialServers() @@ -386,8 +396,8 @@ func (s *SchedulingTestEnvironment) startCluster(m mode) { re.NotEmpty(cluster.WaitLeader()) leaderServer := cluster.GetServer(cluster.GetLeader()) re.NoError(leaderServer.BootstrapCluster()) - s.clusters[pdMode] = cluster - case apiMode: + s.clusters[PDMode] = cluster + case APIMode: cluster, err := NewTestAPICluster(ctx, 1, s.opts...) re.NoError(err) err = cluster.RunInitialServers() @@ -406,7 +416,7 @@ func (s *SchedulingTestEnvironment) startCluster(m mode) { testutil.Eventually(re, func() bool { return cluster.GetLeaderServer().GetServer().GetRaftCluster().IsServiceIndependent(utils.SchedulingServiceName) }) - s.clusters[apiMode] = cluster + s.clusters[APIMode] = cluster } } diff --git a/tools/pd-ctl/tests/config/config_test.go b/tools/pd-ctl/tests/config/config_test.go index c6430789cfc..da9826515de 100644 --- a/tools/pd-ctl/tests/config/config_test.go +++ b/tools/pd-ctl/tests/config/config_test.go @@ -103,7 +103,7 @@ func (suite *configTestSuite) TearDownTest() { func (suite *configTestSuite) TestConfig() { re := suite.Require() re.NoError(failpoint.Enable("github.com/tikv/pd/pkg/dashboard/adapter/skipDashboardLoop", `return(true)`)) - suite.env.RunTestInTwoModes(suite.checkConfig) + suite.env.RunTestBasedOnMode(suite.checkConfig) re.NoError(failpoint.Disable("github.com/tikv/pd/pkg/dashboard/adapter/skipDashboardLoop")) } @@ -348,7 +348,7 @@ func (suite *configTestSuite) checkConfig(cluster *pdTests.TestCluster) { func (suite *configTestSuite) TestConfigForwardControl() { re := suite.Require() re.NoError(failpoint.Enable("github.com/tikv/pd/pkg/dashboard/adapter/skipDashboardLoop", `return(true)`)) - suite.env.RunTestInTwoModes(suite.checkConfigForwardControl) + suite.env.RunTestBasedOnMode(suite.checkConfigForwardControl) re.NoError(failpoint.Disable("github.com/tikv/pd/pkg/dashboard/adapter/skipDashboardLoop")) } @@ -547,7 +547,7 @@ func (suite *configTestSuite) checkConfigForwardControl(cluster *pdTests.TestClu } func (suite *configTestSuite) TestPlacementRules() { - suite.env.RunTestInTwoModes(suite.checkPlacementRules) + suite.env.RunTestBasedOnMode(suite.checkPlacementRules) } func (suite *configTestSuite) checkPlacementRules(cluster *pdTests.TestCluster) { @@ -613,7 +613,7 @@ func (suite *configTestSuite) checkPlacementRules(cluster *pdTests.TestCluster) } func (suite *configTestSuite) TestPlacementRuleGroups() { - suite.env.RunTestInTwoModes(suite.checkPlacementRuleGroups) + suite.env.RunTestBasedOnMode(suite.checkPlacementRuleGroups) } func (suite *configTestSuite) checkPlacementRuleGroups(cluster *pdTests.TestCluster) { @@ -690,7 +690,7 @@ func (suite *configTestSuite) checkPlacementRuleGroups(cluster *pdTests.TestClus } func (suite *configTestSuite) TestPlacementRuleBundle() { - suite.env.RunTestInTwoModes(suite.checkPlacementRuleBundle) + suite.env.RunTestBasedOnMode(suite.checkPlacementRuleBundle) } func (suite *configTestSuite) checkPlacementRuleBundle(cluster *pdTests.TestCluster) { @@ -933,7 +933,7 @@ func TestReplicationMode(t *testing.T) { } func (suite *configTestSuite) TestUpdateDefaultReplicaConfig() { - suite.env.RunTestInTwoModes(suite.checkUpdateDefaultReplicaConfig) + suite.env.RunTestBasedOnMode(suite.checkUpdateDefaultReplicaConfig) } func (suite *configTestSuite) checkUpdateDefaultReplicaConfig(cluster *pdTests.TestCluster) { @@ -1082,7 +1082,7 @@ func (suite *configTestSuite) checkUpdateDefaultReplicaConfig(cluster *pdTests.T } func (suite *configTestSuite) TestPDServerConfig() { - suite.env.RunTestInTwoModes(suite.checkPDServerConfig) + suite.env.RunTestBasedOnMode(suite.checkPDServerConfig) } func (suite *configTestSuite) checkPDServerConfig(cluster *pdTests.TestCluster) { @@ -1115,7 +1115,7 @@ func (suite *configTestSuite) checkPDServerConfig(cluster *pdTests.TestCluster) } func (suite *configTestSuite) TestMicroServiceConfig() { - suite.env.RunTestInTwoModes(suite.checkMicroServiceConfig) + suite.env.RunTestBasedOnMode(suite.checkMicroServiceConfig) } func (suite *configTestSuite) checkMicroServiceConfig(cluster *pdTests.TestCluster) { @@ -1145,7 +1145,7 @@ func (suite *configTestSuite) checkMicroServiceConfig(cluster *pdTests.TestClust } func (suite *configTestSuite) TestRegionRules() { - suite.env.RunTestInTwoModes(suite.checkRegionRules) + suite.env.RunTestBasedOnMode(suite.checkRegionRules) } func (suite *configTestSuite) checkRegionRules(cluster *pdTests.TestCluster) { diff --git a/tools/pd-ctl/tests/hot/hot_test.go b/tools/pd-ctl/tests/hot/hot_test.go index dea49a1ffdd..858f2a8d61f 100644 --- a/tools/pd-ctl/tests/hot/hot_test.go +++ b/tools/pd-ctl/tests/hot/hot_test.go @@ -75,7 +75,7 @@ func (suite *hotTestSuite) TearDownTest() { } func (suite *hotTestSuite) TestHot() { - suite.env.RunTestInTwoModes(suite.checkHot) + suite.env.RunTestBasedOnMode(suite.checkHot) } func (suite *hotTestSuite) checkHot(cluster *pdTests.TestCluster) { @@ -245,7 +245,7 @@ func (suite *hotTestSuite) checkHot(cluster *pdTests.TestCluster) { } func (suite *hotTestSuite) TestHotWithStoreID() { - suite.env.RunTestInTwoModes(suite.checkHotWithStoreID) + suite.env.RunTestBasedOnMode(suite.checkHotWithStoreID) } func (suite *hotTestSuite) checkHotWithStoreID(cluster *pdTests.TestCluster) { @@ -312,7 +312,7 @@ func (suite *hotTestSuite) checkHotWithStoreID(cluster *pdTests.TestCluster) { } func (suite *hotTestSuite) TestHotWithoutHotPeer() { - suite.env.RunTestInTwoModes(suite.checkHotWithoutHotPeer) + suite.env.RunTestBasedOnMode(suite.checkHotWithoutHotPeer) } func (suite *hotTestSuite) checkHotWithoutHotPeer(cluster *pdTests.TestCluster) { diff --git a/tools/pd-ctl/tests/operator/operator_test.go b/tools/pd-ctl/tests/operator/operator_test.go index 7e5d390c4ce..91e97c66dbd 100644 --- a/tools/pd-ctl/tests/operator/operator_test.go +++ b/tools/pd-ctl/tests/operator/operator_test.go @@ -57,7 +57,7 @@ func (suite *operatorTestSuite) TearDownSuite() { } func (suite *operatorTestSuite) TestOperator() { - suite.env.RunTestInTwoModes(suite.checkOperator) + suite.env.RunTestBasedOnMode(suite.checkOperator) } func (suite *operatorTestSuite) checkOperator(cluster *pdTests.TestCluster) { diff --git a/tools/pd-ctl/tests/scheduler/scheduler_test.go b/tools/pd-ctl/tests/scheduler/scheduler_test.go index 3ea81961015..3f58175b5fa 100644 --- a/tools/pd-ctl/tests/scheduler/scheduler_test.go +++ b/tools/pd-ctl/tests/scheduler/scheduler_test.go @@ -99,7 +99,7 @@ func (suite *schedulerTestSuite) TearDownTest() { } func (suite *schedulerTestSuite) TestScheduler() { - suite.env.RunTestInTwoModes(suite.checkScheduler) + suite.env.RunTestBasedOnMode(suite.checkScheduler) } func (suite *schedulerTestSuite) checkScheduler(cluster *pdTests.TestCluster) { @@ -392,7 +392,7 @@ func (suite *schedulerTestSuite) checkScheduler(cluster *pdTests.TestCluster) { } func (suite *schedulerTestSuite) TestSchedulerConfig() { - suite.env.RunTestInTwoModes(suite.checkSchedulerConfig) + suite.env.RunTestBasedOnMode(suite.checkSchedulerConfig) } func (suite *schedulerTestSuite) checkSchedulerConfig(cluster *pdTests.TestCluster) { @@ -558,7 +558,7 @@ func (suite *schedulerTestSuite) checkSchedulerConfig(cluster *pdTests.TestClust } func (suite *schedulerTestSuite) TestHotRegionSchedulerConfig() { - suite.env.RunTestInTwoModes(suite.checkHotRegionSchedulerConfig) + suite.env.RunTestBasedOnMode(suite.checkHotRegionSchedulerConfig) } func (suite *schedulerTestSuite) checkHotRegionSchedulerConfig(cluster *pdTests.TestCluster) { @@ -725,7 +725,7 @@ func (suite *schedulerTestSuite) checkHotRegionSchedulerConfig(cluster *pdTests. } func (suite *schedulerTestSuite) TestSchedulerDiagnostic() { - suite.env.RunTestInTwoModes(suite.checkSchedulerDiagnostic) + suite.env.RunTestBasedOnMode(suite.checkSchedulerDiagnostic) } func (suite *schedulerTestSuite) checkSchedulerDiagnostic(cluster *pdTests.TestCluster) { diff --git a/tools/pd-ut/ut.go b/tools/pd-ut/ut.go index fbf2a640651..de62151fcb3 100644 --- a/tools/pd-ut/ut.go +++ b/tools/pd-ut/ut.go @@ -62,6 +62,9 @@ pd-ut run // run test all cases of a single package pd-ut run $package +// run test all cases of a set of packages +pd-ut run $package1,$package2,... + // run test cases of a single package pd-ut run $package $test @@ -102,7 +105,8 @@ var ( race bool junitFile string coverProfile string - ignoreDir string + ignoreDirs string + cache bool ) func main() { @@ -110,7 +114,8 @@ func main() { parallelStr := stripFlag("--parallel") junitFile = stripFlag("--junitfile") coverProfile = stripFlag("--coverprofile") - ignoreDir = stripFlag("--ignore") + ignoreDirs = stripFlag("--ignore") + cache = handleFlag("--cache") if coverProfile != "" { var err error @@ -171,6 +176,8 @@ func main() { switch os.Args[2] { case "run": isSucceed = cmdRun(os.Args[3:]...) + case "list": + isSucceed = cmdList(os.Args[3:]...) default: isSucceed = usage() } @@ -249,7 +256,7 @@ func cmdBuild(args ...string) bool { // build all packages if len(args) == 0 { - err := buildTestBinaryMulti(pkgs) + _, err := buildTestBinaryMulti(pkgs) if err != nil { fmt.Println("build package error", pkgs, err) return false @@ -266,7 +273,7 @@ func cmdBuild(args ...string) bool { } } - err := buildTestBinaryMulti(dirPkgs) + _, err := buildTestBinaryMulti(dirPkgs) if err != nil { log.Println("build package error", dirPkgs, err) return false @@ -286,55 +293,30 @@ func cmdRun(args ...string) bool { start := time.Now() // run all tests if len(args) == 0 { - err := buildTestBinaryMulti(pkgs) + tasks, err = runExistingTestCases(pkgs) if err != nil { - fmt.Println("build package error", pkgs, err) + fmt.Println("run existing test cases error", err) return false } - - for _, pkg := range pkgs { - exist, err := testBinaryExist(pkg) - if err != nil { - fmt.Println("check test binary existence error", err) - return false - } - if !exist { - fmt.Println("no test case in ", pkg) - continue - } - - tasks = listTestCases(pkg, tasks) - } } // run tests for a single package if len(args) == 1 { + dirs := strings.Split(args[0], ",") var dirPkgs []string for _, pkg := range pkgs { - if strings.Contains(pkg, args[0]) { - dirPkgs = append(dirPkgs, pkg) + for _, dir := range dirs { + if strings.Contains(pkg, dir) { + dirPkgs = append(dirPkgs, pkg) + } } } - err := buildTestBinaryMulti(dirPkgs) + tasks, err = runExistingTestCases(dirPkgs) if err != nil { - log.Println("build package error", dirPkgs, err) + fmt.Println("run existing test cases error", err) return false } - - for _, pkg := range dirPkgs { - exist, err := testBinaryExist(pkg) - if err != nil { - fmt.Println("check test binary existence error", err) - return false - } - if !exist { - fmt.Println("no test case in ", pkg) - continue - } - - tasks = listTestCases(pkg, tasks) - } } // run a single test @@ -408,6 +390,48 @@ func cmdRun(args ...string) bool { return true } +func runExistingTestCases(pkgs []string) (tasks []task, err error) { + // run tests for a single package + content, err := buildTestBinaryMulti(pkgs) + if err != nil { + fmt.Println("build package error", pkgs, err) + return nil, err + } + + // read content + existPkgs := make(map[string]struct{}) + for _, line := range strings.Split(string(content), "\n") { + if len(line) == 0 || strings.Contains(line, "no test files") { + continue + } + // format is + // ? github.com/tikv/pd/server/apiv2/middlewares [no test files] + // ok github.com/tikv/pd/server/api 0.173s + existPkgs[strings.Split(line, "\t")[1]] = struct{}{} + fmt.Println(line) + } + + wg := &sync.WaitGroup{} + tasksChannel := make(chan []task, len(pkgs)) + for _, pkg := range pkgs { + _, ok := existPkgs[fmt.Sprintf("%s/%s", modulePath, pkg)] + if !ok { + fmt.Println("no test case in ", pkg) + continue + } + + wg.Add(1) + go listTestCasesConcurrent(wg, pkg, tasksChannel) + } + + wg.Wait() + close(tasksChannel) + for t := range tasksChannel { + tasks = append(tasks, t...) + } + return tasks, nil +} + // stripFlag strip the '--flag xxx' from the command line os.Args // Example of the os.Args changes // Before: ut run pkg TestXXX --coverprofile xxx --junitfile yyy --parallel 16 @@ -470,6 +494,16 @@ func listTestCases(pkg string, tasks []task) []task { return tasks } +func listTestCasesConcurrent(wg *sync.WaitGroup, pkg string, tasksChannel chan<- []task) { + defer wg.Done() + newCases := listNewTestCases(pkg) + var tasks []task + for _, c := range newCases { + tasks = append(tasks, task{pkg, c}) + } + tasksChannel <- tasks +} + func filterTestCases(tasks []task, arg1 string) ([]task, error) { if strings.HasPrefix(arg1, "r:") { r, err := regexp.Compile(arg1[2:]) @@ -665,8 +699,9 @@ func (*numa) testCommand(pkg string, fn string) *exec.Cmd { func skipDIR(pkg string) bool { skipDir := []string{"bin", "cmd", "realcluster"} - if ignoreDir != "" { - skipDir = append(skipDir, ignoreDir) + if ignoreDirs != "" { + dirs := strings.Split(ignoreDirs, ",") + skipDir = append(skipDir, dirs...) } for _, ignore := range skipDir { if strings.HasPrefix(pkg, ignore) { @@ -677,6 +712,10 @@ func skipDIR(pkg string) bool { } func generateBuildCache() error { + if !cache { + return nil + } + fmt.Println("generate build cache") // cd cmd/pd-server && go test -tags=tso_function_test,deadlock -exec-=true -vet=off -toolexec=go-compile-without-link cmd := exec.Command("go", "test", "-exec=true", "-vet", "off", "--tags=tso_function_test,deadlock") goCompileWithoutLink := fmt.Sprintf("-toolexec=%s/tools/pd-ut/go-compile-without-link.sh", workDir) @@ -687,7 +726,6 @@ func generateBuildCache() error { workDir[:strings.LastIndex(workDir, integrationsTestPath)]) } cmd.Args = append(cmd.Args, goCompileWithoutLink) - cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { @@ -697,11 +735,11 @@ func generateBuildCache() error { } // buildTestBinaryMulti is much faster than build the test packages one by one. -func buildTestBinaryMulti(pkgs []string) error { +func buildTestBinaryMulti(pkgs []string) ([]byte, error) { // staged build, generate the build cache for all the tests first, then generate the test binary. // This way is faster than generating test binaries directly, because the cache can be used. if err := generateBuildCache(); err != nil { - return withTrace(err) + return nil, withTrace(err) } // go test --exec=xprog --tags=tso_function_test,deadlock -vet=off --count=0 $(pkgs) @@ -726,13 +764,28 @@ func buildTestBinaryMulti(pkgs []string) error { cmd.Args = append(cmd.Args, "-cover", fmt.Sprintf("-coverpkg=%s", coverpkg)) } cmd.Args = append(cmd.Args, packages...) + if race { + cmd.Args = append(cmd.Args, "-race") + } cmd.Dir = workDir - cmd.Stdout = os.Stdout + outputFile, err := os.CreateTemp("", "test_pd_ut*.out") + if err != nil { + return nil, err + } + cmd.Stdout = outputFile cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { - return withTrace(err) + return nil, withTrace(err) } - return nil + + // return content + content, err := os.ReadFile(outputFile.Name()) + if err != nil { + return nil, err + } + defer outputFile.Close() + + return content, nil } func buildTestBinary(pkg string) error {