package slog_file

import (
	"os"
	"testing"
	"time"

	"wartank/pkg/mock/mockenv"
	"wartank/pkg/mock/mockkernel"
)

/*
	Тест для интерфейса логгера в файл
*/

type tester struct {
	t    *testing.T
	err  error
	me   *mockenv.MockEnv
	kern *mockkernel.MockKernel
	sf   *SlogFile
}

func TestSlogFile(t *testing.T) {
	_ = os.RemoveAll("./log")
	test := &tester{
		t:  t,
		me: mockenv.NewMockEnv(),
	}
	test.create()
	test.write()
	test.close()
	test.writeBad1()
	test.cancel()
	_ = os.RemoveAll("./log")
}

// файл уже закрыт
func (sf *tester) writeBad1() {
	if err := sf.sf.write([]byte{}); err == nil {
		sf.t.Errorf("write(): err==nil")
	}
}

// закрытие логгера
func (sf *tester) close() {
	sf.t.Logf("=close=")
	sf.kern.CancelApp()
	sf.kern.Wg().Wait()
	sf.sf.Write("")
}

// отмена работы
func (sf *tester) cancel() {
	sf.t.Logf("=cancal=")
	sf.createGood1()
	sf.kern.CancelApp()
	sf.kern.Wg().Wait()
}

// запись сообщения
func (sf *tester) write() {
	sf.t.Logf("=write=")
	sf.sf.Write("test msg")
	time.Sleep(time.Millisecond * 150)
}

// Создание файлового логгера
func (sf *tester) create() {
	sf.t.Logf("=create=")
	sf.createBad1()
	sf.createBad2()
	sf.createGood1()
}

func (sf *tester) createGood1() {
	sf.t.Logf("=createGood1=")
	sf.sf, sf.err = NewSlogFile(sf.kern, "test")
	if sf.err != nil {
		sf.t.Errorf("createGood1(): err=%v", sf.err)
	}
	if sf.sf == nil {
		sf.t.Errorf("createGood1(): SlogFile == nil")
	}
}

// Нет верси сборки
func (sf *tester) createBad2() {
	sf.t.Logf("=createBad2=")
	sf.kern = mockkernel.NewMockKernel()
	sf.sf, sf.err = NewSlogFile(sf.kern, "")
	if sf.err == nil {
		sf.t.Errorf("createBad2(): err == nil")
	}
	if sf.sf != nil {
		sf.t.Errorf("createBad2(): SlogFile != nil")
	}
}

// Нет объекта ядра
func (sf *tester) createBad1() {
	sf.t.Logf("=createBad1=")
	sf.sf, sf.err = NewSlogFile(nil, "test")
	if sf.err == nil {
		sf.t.Errorf("createBad1(): err == nil")
	}
	if sf.sf != nil {
		sf.t.Errorf("createBad1(): SlogFile != nil")
	}
}
