package cmd

import (
	"context"
	"io/ioutil"
	"os"

	"github.com/pingcap-inc/alioth/pkg/util"
	logpattern_go_proto "github.com/pingcap-inc/alioth/proto"
	"github.com/pingcap-inc/alioth/storage"
	. "github.com/pingcap/check"
)

var _ = Suite(&testLogExtractorSuite{})

type testLogExtractorSuite struct {
}

func (t *testLogExtractorSuite) TestLogExtract(c *C) {
	tmpdir, err := ioutil.TempDir("./", "logpattern_test")
	c.Assert(err, IsNil)
	defer os.RemoveAll(tmpdir)

	store, err := storage.NewStore(tmpdir)
	c.Assert(err, IsNil)
	ExtractLogPattern(store, "./", nil, &logpattern_go_proto.LogPatternRule{
		LogLevel: []string{"fatal"},
	})

	fatalInfo := map[string]int{
		"cmd/analyze.go":       4,
		"cmd/extract.go":       7,
		"cmd/merge.go":         2,
		"cmd/scan.go":          8,
		"cmd/debug/diff.go":    9,
		"cmd/debug/display.go": 7,
	}

	result := make(map[string]int)
	store.ScanLogPattern(context.Background(), func(_, value []byte) error {
		lp := &logpattern_go_proto.LogPattern{}
		err1 := lp.Unmarshal(value)
		c.Assert(err1, IsNil)
		c.Assert(lp.Pos.PackageInfo.Repo, Equals, "github.com/pingcap-inc/alioth")
		if _, ok := result[lp.Pos.FilePath]; ok {
			result[lp.Pos.FilePath] = result[lp.Pos.FilePath] + 1
		} else {
			result[lp.Pos.FilePath] = 1
		}
		return nil
	})
	c.Assert(result, DeepEquals, fatalInfo)

	rule, err := util.GetLogPatternRule(store)
	c.Assert(err, IsNil)
	c.Assert(rule, DeepEquals, &logpattern_go_proto.LogPatternRule{
		LogLevel: []string{"fatal"},
	})
}
