package pdfun

import (
	"github.com/pingcap/endless/pkg/util"
	"github.com/pingcap/endless/testcase/oltp/oltppkg"
	"github.com/pingcap/test-infra/sdk/resource"
)

func TestSuiteTools(caseParams *oltppkg.CaseParams) {
	util.TestCase("kill and restart br while running importing, check if pd scheduler can be resumed after one ttl", "oltp_tools_br_rel_001", func() {
		OLTP_TOOLS_BR_REL_001(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.WorkloadRunParms, caseParams.Br, caseParams.S3Parms)
	})
	util.TestCase("Inject failure to pd while running br importing, check if pd scheduler can be resumed after one ttl", "oltp_tools_br_rel_002", func() {
		OLTP_TOOLS_BR_REL_002(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.WorkloadRunParms, caseParams.Br, caseParams.S3Parms)
	})
	util.TestCase("Region should be balance after importing via lightning", "oltp_tools_lightning_fun_001", func() {
		OLTP_TOOLS_LIGHTNING_FUN_001(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.WorkloadRunParms, caseParams.S3Parms)
	})
	util.TestCase("kill and restart lightning while running importing, check if pd scheduler can be resumed after one ttl", "oltp_tools_lightning_rel_001", func() {
		OLTP_TOOLS_LIGHTNING_REL_001(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.WorkloadRunParms, caseParams.S3Parms)
	})
	util.TestCase("Down one tikv during run lightning", "oltp_tools_lightning_rel_002", func() {
		OLTP_TOOLS_LIGHTNING_REL_002(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.WorkloadRunParms, caseParams.S3Parms)
	})
}

func TestSuiteFeatures(caseParams *oltppkg.CaseParams) {
	util.TestCase("Evict leader should works fine before run scale in", "oltp_evict_leader_fun_001", func() {
		OLTP_EVICT_LEADER_FUN_001(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.WorkloadRunParms)
	})
	util.TestCase("Evict leader should works fine during run scale in", "oltp_evict_leader_fun_002", func() {
		OLTP_EVICT_LEADER_FUN_002(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.WorkloadRunParms)
	})
	util.TestCase("Evict leader should works fine after inject pd leader failure", "oltp_evict_leader_rel_001", func() {
		OLTP_EVICT_LEADER_REL_001(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.WorkloadRunParms)
	})
	util.TestCase("Evict leader on the down tikv should works fine", "oltp_evict_leader_rel_002", func() {
		OLTP_EVICT_LEADER_REL_002(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.WorkloadRunParms)
	})
	util.TestCase("Evict leader should works fine if another tikv down", "oltp_evict_leader_rel_003", func() {
		OLTP_EVICT_LEADER_REL_003(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.WorkloadRunParms)
	})
	util.TestCase("Hot region history query should work fine while inject pd chaos", "oltp_hot_region_history_rel_001", func() {
		OLTP_HOT_REGION_HISTORY_REL_001(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.WorkloadRunParms)
	})
	util.TestCase("Hot region history query should work fine while inject tikv chaos", "oltp_hot_region_history_rel_002", func() {
		OLTP_HOT_REGION_HISTORY_REL_002(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.WorkloadRunParms)
	})
	util.TestCase("Qps should not drop more than 10% after enable tso scalibilty feature", "oltp_tso_scalibility_fun_001", func() {
		OLTP_TSO_SCALIBILITY_FUN_001(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms.WorkloadType.Type[0], caseParams.WorkloadRunParms.Cmdpr)
	})
}

func TestSuiteCommon(caseParams *oltppkg.CaseParams) {
	util.TestCase("Qps should not drop after pause and resume the scheduler", "oltp_pause_resume_scheduler_fun_001", func() {
		OLTP_PAUSE_RESUME_SCHEDULER_FUN_001(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.WorkloadRunParms)
	})

	util.TestCase("Qps should not drop during run split and merge repeatly", "oltp_split_merge_fun_001", func() {
		OLTP_SPLIT_MERGE_FUN_001(caseParams.Ctx, caseParams.Tc, caseParams.CaseCmdParms, caseParams.WorkloadRunParms)
	})
}
func TestSuiteStability(caseParams *oltppkg.CaseParams) {
	util.TestCase("qps should be stable when continue insert till disk full.", "oltp_disk_full_stability_001", func() {
		OLTP_DISK_FULL_STABILITY_001(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.BenchToolset, caseParams.SkipAfterEachCheck)
	})
	util.TestCase("QPS should be stable during split region repeatly and add shuffle schedules", "oltp_shuffle_scheduler_stability_001", func() {
		OLTP_SHUFFLE_SCHEDULER_STABILITY_001(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.WorkloadRunParms)
	})
	util.TestCase("should keep system stable while inject pd chaos during run split and merge.", "oltp_split_merge_stability_rel_001", func() {
		OLTP_SPLIT_MERGE_STABILITY_REL_001(caseParams.Ctx, caseParams.Tc.(resource.TiDBCluster), caseParams.CaseCmdParms, caseParams.WorkloadRunParms)
	})
}
