package e2e

import (
	"flag"
	"os"
	"testing"

	"github.com/onsi/gomega"

	"github.com/onsi/ginkgo"
	runtimeutils "k8s.io/apimachinery/pkg/util/runtime"
	"k8s.io/klog"

	"github.com/pingcap/test-infra/sdk/e2etest/framework"

	// test sources
	_ "github.com/pingcap/test-infra/sdk/e2etest/testcase/br"
	_ "github.com/pingcap/test-infra/sdk/e2etest/testcase/chaos"
	_ "github.com/pingcap/test-infra/sdk/e2etest/testcase/dm"
	_ "github.com/pingcap/test-infra/sdk/e2etest/testcase/drainer"
	_ "github.com/pingcap/test-infra/sdk/e2etest/testcase/kafka"
	_ "github.com/pingcap/test-infra/sdk/e2etest/testcase/lightning"
	_ "github.com/pingcap/test-infra/sdk/e2etest/testcase/loadbalancer"
	_ "github.com/pingcap/test-infra/sdk/e2etest/testcase/mysql"
	_ "github.com/pingcap/test-infra/sdk/e2etest/testcase/mysqllocal"
	_ "github.com/pingcap/test-infra/sdk/e2etest/testcase/tidbcloud_cluster"
	_ "github.com/pingcap/test-infra/sdk/e2etest/testcase/tidbcluster"
	_ "github.com/pingcap/test-infra/sdk/e2etest/testcase/tidbclusterlocal"
	_ "github.com/pingcap/test-infra/sdk/e2etest/testcase/workloadnode"
	_ "github.com/pingcap/test-infra/sdk/e2etest/testcase/workloadnodelocal"
)

// handleFlags sets up all flags and parses the command line.
func handleFlags() {
	framework.RegisterFlags(flag.CommandLine)
	flag.Parse()
}

func TestMain(m *testing.M) {
	// Register test flags, then parse flags.
	handleFlags()

	os.Exit(m.Run())
}

func TestSDK(t *testing.T) {
	RunE2ETests(t)
}

func RunE2ETests(t *testing.T) {
	runtimeutils.ReallyCrash = true

	gomega.RegisterFailHandler(framework.Fail)

	// Run tests through the Ginkgo runner with output to console + JUnit for Jenkins
	var r []ginkgo.Reporter
	klog.Infof("Starting e2e run on Ginkgo")

	ginkgo.RunSpecsWithDefaultAndCustomReporters(t, "SDK E2E test suite", r)
}
