package storage

import (
	"testing"

	"github.com/ngaut/log"
	. "github.com/pingcap/check"
	"github.com/pingcap/schrodinger/pkg/types"
	"github.com/pingcap/schrodinger/util"
)

func TestT(t *testing.T) {
	TestingT(t)
}

var _ = Suite(&testProcessSuite{})

type testProcessSuite struct {
	store *Storage
}

func (t *testProcessSuite) SetUpSuite(c *C) {
	t.store = setupStore("testProcess")
}

func (t *testProcessSuite) TearDownSuite(c *C) {
	t.store.Close()
}

var overrideArgs = "--args1=1 --args2=2"

var testProcess = &types.TestProcess{
	Name:         "bank",
	BoxID:        2,
	ExperimentID: 1,
	Status:       types.TestStateRunning,
	Template:     testTemplate,
	OverrideArgs: &overrideArgs,
	Report:       &types.TestReport{Log: "xxxx"},
	Mark:         "mark",
	Namespace:    "test-1",
	Meta: &types.Meta{
		Labels: map[string]string{
			"node": "bench",
			"idc":  "idc",
		},
	},
}

func (t *testProcessSuite) TestTestProcess(c *C) {
	ct := &types.TestTemplate{}
	err := util.Clone(ct, testTemplate)
	c.Assert(err, Equals, nil)

	// test for CreateTestTemplate
	err = t.store.CreateTestTemplate(ct)
	if err != nil {
		log.Error(err)
	}
	c.Assert(err, Equals, nil)

	tp := &types.TestProcess{}
	err = util.Clone(tp, testProcess)
	c.Assert(err, Equals, nil)
	tp.Template = ct

	// test for CreateTestProcess
	err = t.store.CreateTestProcess(tp)
	if err != nil {
		log.Error(err)
	}
	c.Assert(err, Equals, nil)

	tp1, ok := t.store.GetTestProcess(tp.ID)
	c.Assert(ok, Equals, true)

	c.Assert(tp1, DeepEquals, tp)

	// test for UpdateTestProcess
	tp.Status = types.TestStateFinished
	tp.Mark = "xx"
	tp.Labels = map[string]string{"node": "general"}
	tp.OverrideArgs = nil

	err = t.store.UpdateTestProcess(tp)
	if err != nil {
		log.Error(err)
	}
	c.Assert(err, Equals, nil)

	tp2, ok := t.store.GetTestProcess(tp.ID)
	c.Assert(ok, Equals, true)
	c.Assert(tp2, DeepEquals, tp)

	tp.Name = "te2"
	err = t.store.CreateTestProcess(tp)
	if err != nil {
		log.Error(err)
	}
	c.Assert(err, Equals, nil)
	tpsAll := t.store.ListTestProcess()
	c.Assert(len(tpsAll), Equals, 2)
	c.Assert(tpsAll[1].Name, Equals, tp.Name)
}
