package test

import (
	"log"
	"os"
	"sync"
	"testing"

	"github.com/ethereum/go-ethereum/logger"
)

// logging in tests

var once sync.Once

/* usage:
func TestFunc(t *testing.T) {
    test.LogInit()
    // test
}
*/
func LogInit() {
	once.Do(func() {
		var logsys = logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.LogLevel(logger.WarnLevel))
		logger.AddLogSystem(logsys)
	})
}

type testLogger struct{ t *testing.T }

/* usage:
func TestFunc(t *testing.T) {
    defer test.Testlog.Detach()
    // test
}
*/
func Testlog(t *testing.T) testLogger {
	logger.Reset()
	l := testLogger{t}
	logger.AddLogSystem(l)
	return l
}

func (testLogger) GetLogLevel() logger.LogLevel { return logger.DebugLevel }
func (testLogger) SetLogLevel(logger.LogLevel)  {}

func (l testLogger) LogPrint(level logger.LogLevel, msg string) {
	l.t.Logf("%s", msg)
}

func (testLogger) Detach() {
	logger.Flush()
	logger.Reset()
}

type benchLogger struct{ b *testing.B }

/* usage:
func BenchmarkFunc(b *testing.B) {
    defer test.Benchlog.Detach()
    // test
}
*/
func Benchlog(b *testing.B) benchLogger {
	logger.Reset()
	l := benchLogger{b}
	logger.AddLogSystem(l)
	return l
}

func (benchLogger) GetLogLevel() logger.LogLevel { return logger.Silence }

func (benchLogger) SetLogLevel(logger.LogLevel) {}
func (l benchLogger) LogPrint(level logger.LogLevel, msg string) {
	l.b.Logf("%s", msg)
}
func (benchLogger) Detach() {
	logger.Flush()
	logger.Reset()
}