package log

import (
	"testing"
	"time"

	"github.com/onsi/gomega"
	"github.com/pingcap/tidb/types"

	"github.com/pingcap-inc/clinic/pkg/slow_query/variable"
)

func Test_StandardLogType(t *testing.T) {
	lr := LogRecord{
		LogType: standardType,
		Record:  "[2021/10/26 17:24:06.093 +08:00] [INFO] [server.go:194%d] [\"register REST path\"] [path=/pd/api/v1]\n",
	}

	g := gomega.NewWithT(t)
	r, err := logDissectMap[lr.LogType].convertToRecord(lr)
	g.Expect(err).To(gomega.Succeed())
	g.Expect(r.Level).To(gomega.Equal("info"))

	ts, err := time.Parse("2006/01/02 15:04:05.000 -07:00", "2021/10/26 17:24:06.093 +08:00")
	g.Expect(err).To(gomega.Succeed())
	g.Expect(r.Timestamp).To(gomega.Equal(ts.UnixNano() / 1000000))

	g.Expect(r.Message).To(gomega.Equal("[server.go:194%d] [\"register REST path\"] [path=/pd/api/v1]\n"))
}

func Test_TiFlashErrType(t *testing.T) {
	lr := LogRecord{
		LogType: tiflashErrType,
		Record:  "2021.11.01 23:31:29.123456 [ 1 ] <Error> pingcap.tikv: Get Failed14: failed to connect to all addresses\n",
	}

	g := gomega.NewWithT(t)
	r, err := logDissectMap[lr.LogType].convertToRecord(lr)
	g.Expect(err).To(gomega.Succeed())
	g.Expect(r.Level).To(gomega.Equal("error"))

	loc, err := time.LoadLocation("Asia/Chongqing")
	g.Expect(err).To(gomega.Succeed())
	ts, err := time.ParseInLocation("2006.01.02 15:04:05.000000", "2021.11.01 23:31:29.123456", loc)
	g.Expect(err).To(gomega.Succeed())
	g.Expect(r.Timestamp).To(gomega.Equal(ts.UnixNano() / 1000000))

	g.Expect(r.Message).To(gomega.Equal("[ 1 ] <Error> pingcap.tikv: Get Failed14: failed to connect to all addresses\n"))
}

func Test_SlowQueryType(t *testing.T) {
	lr := LogRecord{
		LogType: slowQueryType,
		Record:  "# Time: 2019-08-22T10:46:31.81833097+08:00 # Txn_start_ts: 410633369355550820\n# User: root@127.0.0.1\n# Conn_ID: 2073",
	}

	g := gomega.NewWithT(t)
	_, err := logDissectMap[lr.LogType].convertToRecord(lr)
	g.Expect(err).Should(gomega.HaveOccurred())
	_, err = logDissectMap[lr.LogType].convertToSlowQueryRecord(lr)
	g.Expect(err).Should(gomega.HaveOccurred())
	lr = LogRecord{
		Record: "# Time: 2019-08-22T10:46:31.81833097+08:00 # Txn_start_ts: 410633369355550820\n# User: root@127.0.0.1\n# Conn_ID: 2073",
		SlowQueryRecord: &SlowQueryLogRecord{
			SlowQueryCol: map[string]int{
				variable.SlowLogTimeStr:       0,
				variable.SlowLogTxnStartTSStr: 1,
				variable.SlowLogUserStr:       2,
				variable.SlowLogHostStr:       3,
				variable.SlowLogConnIDStr:     4,
				variable.SlowLogSucc:          5,
			},
			SlowQueryDatum: []types.Datum{
				types.NewStringDatum("2019-08-22T10:46:31.81833097+08:00"),
				types.NewUintDatum(410633369355550820),
				types.NewStringDatum("root"),
				types.NewStringDatum("127.0.0.1"),
				types.NewUintDatum(2073),
				types.NewUintDatum(1),
			},
		},
		LogType: slowQueryType,
	}
	r, err := logDissectMap[lr.LogType].convertToSlowQueryRecord(lr)
	g.Expect(err).To(gomega.Succeed())
	ts, err := time.Parse(time.RFC3339Nano, "2019-08-22T10:46:31.81833097+08:00")
	g.Expect(err).To(gomega.Succeed())
	g.Expect(r.Timestamp).To(gomega.Equal(ts.UnixNano() / 1000000))
	g.Expect(r.ConnetionID).To(gomega.Equal(uint64(2073)))
	g.Expect(r.Success).To(gomega.Equal(int64(1)))
	// g.Expect(r.Message).To(gomega.Equal("# Time: 2019-08-22T10:46:31.81833097+08:00 # Txn_start_ts: 410633369355550820\n# User: root@127.0.0.1\n# Conn_ID: 2073"))
}
