package log

import (
	"bytes"
	"fmt"
	"strings"
	"testing"

	"github.com/onsi/gomega"

	"github.com/pingcap-inc/clinic/pkg/importer/utils"
)

func Test_LogIteratorEmtpy(t *testing.T) {
	clusterID := "1221211"
	iterator := NewLogIterator(bytes.NewReader(nil), fmt.Sprintf("%s-%s", utils.FnvHash("8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108"), utils.FnvHash("172.16.5.137/home/tiops/tidb-deploy/tidb-4000/log/tidb.log")), clusterID, "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108", &LogRecordOption{
		instanceID: "tidb-4000",
	})

	g := gomega.NewWithT(t)
	for i := 0; i < 100; i++ {
		v, next := iterator.Next()
		g.Expect(v.(LogRecord).Record).To(gomega.Equal(""))
		g.Expect(next).To(gomega.BeFalse())
	}
}

func Test_LogBigLine(t *testing.T) {
	clusterID := "1221211"
	bt := make([]byte, 1024*1024)
	for i := 0; i < len(bt); i++ {
		bt[i] = '1'
	}

	iterator := NewLogIterator(bytes.NewReader(bt), fmt.Sprintf("%s-%s", utils.FnvHash("8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108"), utils.FnvHash("172.16.5.137/home/tiops/tidb-deploy/tidb-4000/log/tidb.log")), clusterID, "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108", &LogRecordOption{
		instanceID: "tidb-4000",
	})

	g := gomega.NewWithT(t)
	v, next := iterator.Next()
	g.Expect(next).To(gomega.BeTrue())
	g.Expect(v.(LogRecord).Record).To(gomega.Equal(string(bt)))

	_, next = iterator.Next()
	g.Expect(next).To(gomega.BeFalse())
}

func Test_LogBigLineWithDlim(t *testing.T) {
	bt := make([]byte, 1024*1024+1)
	for i := 0; i < 1024*1024; i++ {
		bt[i] = '1'
	}
	bt[1024*1024] = '\n'

	clusterID := "1221211"
	iterator := NewLogIterator(bytes.NewReader(bt), fmt.Sprintf("%s-%s", utils.FnvHash("8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108"), utils.FnvHash("172.16.5.137/home/tiops/tidb-deploy/tidb-4000/log/tidb.log")), clusterID, "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108", &LogRecordOption{
		instanceID: "tidb-4000",
	})

	g := gomega.NewWithT(t)
	v, next := iterator.Next()
	g.Expect(next).To(gomega.BeTrue())
	g.Expect(v.(LogRecord).Record).To(gomega.Equal(string(bt[:len(bt)-1])))

	_, next = iterator.Next()
	g.Expect(next).To(gomega.BeFalse())
}

func Test_LogIterator(t *testing.T) {
	var data string
	len := 11
	for i := 0; i < len; i++ {
		data += fmt.Sprintf("data%d\n", i)
	}

	clusterID := "1221211"
	iterator := NewLogIterator(bytes.NewReader([]byte(data)), fmt.Sprintf("%s-%s", utils.FnvHash("8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108"), utils.FnvHash("172.16.5.137/home/tiops/tidb-deploy/tidb-4000/log/tidb.log")), clusterID, "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108", &LogRecordOption{
		instanceID: "tidb-4000",
	})

	g := gomega.NewWithT(t)
	for i := 0; i < 100; i++ {
		v, next := iterator.Next()
		if i < len-1 {
			g.Expect(v.(LogRecord).Record).To(gomega.Equal(fmt.Sprintf("data%d", i)))
			g.Expect(next).To(gomega.BeTrue())
		}

		if i == len-1 {
			g.Expect(v.(LogRecord).Record).To(gomega.Equal(fmt.Sprintf("data%d", i)))
			g.Expect(next).To(gomega.BeTrue())
		}

		if i >= len {
			g.Expect(v.(LogRecord).Record).To(gomega.Equal(""))
			g.Expect(next).To(gomega.BeFalse())
		}
	}
}

func Test_SlowQueryIterator(t *testing.T) {
	var data string
	len := 77
	for i := 0; i < len; i++ {
		data += "# Time: 2019-08-22T10:46:31.81833097+08:00\n# Txn_start_ts: 410633369355550820\n# User@Host: root@127.0.0.1\n# Conn_ID: 2073\nselect * from t;\n"
	}

	clusterID := "1221211"
	iterator := NewLogIterator(strings.NewReader(data), fmt.Sprintf("%s-%s", utils.FnvHash("8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108"), utils.FnvHash("172.16.5.137/home/tiops/tidb-deploy/tidb-4000/log/tidb.log")), clusterID, "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108", &LogRecordOption{
		instanceID: "tidb-4000",
		logType:    slowQueryType,
	})

	g := gomega.NewWithT(t)

	count := 0
	for v, ok := iterator.Next(); ok; v, ok = iterator.Next() {
		count++
		g.Expect(v.(LogRecord).Record).To(gomega.HavePrefix("# Time: 2019-08-22T10:46:31.81833097+08:00 # Txn_start_ts: 410633369355550820 # User: root # Host: 127.0.0.1 # Conn_ID: 2073"))
	}

	g.Expect(count).To(gomega.Equal(len))
}
