package geopartition_test

import (
	"database/sql"
	"testing"

	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
	"github.com/pingcap/endless/pkg/client/pd"
	pdclient "github.com/pingcap/endless/pkg/client/pd"
	. "github.com/pingcap/endless/pkg/matcher"
	"github.com/pingcap/endless/pkg/util"
	"github.com/pingcap/endless/testcase/geopartition/compatibility"
	"github.com/pingcap/endless/testcase/geopartition/functionality"
	"github.com/pingcap/endless/testcase/geopartition/performance"
	"github.com/pingcap/endless/testcase/geopartition/reliability"

	"github.com/pingcap/endless/testcase/geopartition/security"
	. "github.com/pingcap/endless/testcase/geopartition/utils"
	"github.com/pingcap/test-infra/sdk/resource"
	_ "github.com/pingcap/test-infra/sdk/resource/impl/k8s"
	_ "github.com/pingcap/test-infra/sdk/resource/impl/local"
)

var suiteTestCtx = &SuiteContext{}

var _ = BeforeSuite(func() {
	suiteTestCtx.TestContext = util.AutoConf()
	suiteTestCtx.TC = suiteTestCtx.Resource("tc").(resource.TiDBCluster)
	suiteTestCtx.PD = Try(pdclient.NewPDClient(suiteTestCtx.TC)).(*pd.Client)
	suiteTestCtx.DB = Try(suiteTestCtx.TC.GetDB("test")).(*sql.DB)
	InitTiKVLabels(suiteTestCtx.TC, []string{
		`{"region": "us-east-1"}`,
		`{"region": "us-east-1"}`,
		`{"region": "us-east-2"}`,
		`{"region": "us-east-1", "disk": "ssd"}`,
		`{"region": "us-east-2", "disk": "ssd"}`,
		`{"region": "us-west-1"}`,
		`{"region": "us-west-1", "disk": "ssd"}`,
	})
})

var _ = AfterSuite(func() {
	if suiteTestCtx.DB != nil {
		Try(suiteTestCtx.DB.Close())
	}
})

var _ = BeforeEach(func() {
	Try(suiteTestCtx.DB.Exec("drop database if exists geopartition"))
	Try(suiteTestCtx.DB.Exec("create database geopartition"))
	Try(suiteTestCtx.DB.Exec("use geopartition"))
	Try(suiteTestCtx.DB.Exec("set @@global.tidb_placement_mode='strict'"))
	Try(suiteTestCtx.DB.Exec("set @@tidb_placement_mode='strict'"))
})

var _ = AfterEach(func() {
	Try(suiteTestCtx.DB.Exec("drop database if exists geopartition"))
})

var _ = Describe("CommonTests", func() {
	functionality.Test(suiteTestCtx)
	security.Test(suiteTestCtx)
	compatibility.TiflashTest(suiteTestCtx)
})

var _ = Describe("PerfTests", func() {
	performance.Test(suiteTestCtx)
})

var _ = Describe("BRTests", func() {
	compatibility.BRTest(suiteTestCtx)
})

var _ = Describe("Reliability", func() {
	reliability.Test(suiteTestCtx)
})

func TestGeoPartition(t *testing.T) {
	RegisterFailHandler(Fail)
	RunSpecs(t, "geopartition")
}
