package keeper

import (
	"os"
	"syscall"
	"testing"
	"time"

	"wartank/pkg/components/kernel/slog"
	"wartank/pkg/mock/mockenv"
	"wartank/pkg/mock/mockkernel"
)

/*
	Тест для сторожа
*/

// Тестер для сторожа
type tester struct {
	t    *testing.T
	err  error
	me   *mockenv.MockEnv
	kp   *Keeper
	kern *mockkernel.MockKernel
}

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

// Отмена глобального контекста приложения
func (sf *tester) cancel() {
	sf.kp.chSys <- syscall.SIGTERM
	time.Sleep(time.Microsecond * 150)
	sf.createGood1()
	sf.kern.CancelApp()
	time.Sleep(time.Microsecond * 150)
}

// Создание сторожа
func (sf *tester) create() {
	sf.createBad1()
	sf.createGood1()
}

func (sf *tester) createGood1() {
	defer func() {
		if _panic := recover(); _panic != nil {
			sf.t.Errorf("createGood1(: panic=\n\t%v\n", _panic)
		}
	}()
	sf.me.Unset()
	if err := sf.me.InitLocal(); err != nil {
		sf.t.Errorf("createGood1(): не локальное окружение, err=\n\t%v\n", err)
		return
	}
	sf.kern = mockkernel.NewMockKernel()
	sf.kern.Slog_, sf.err = slog.NewSlog(sf.kern)
	if sf.err != nil {
		sf.t.Errorf("createGood1(): in create ISlog, err=\n\t%v", sf.err)
	}
	sf.kp = NewKeeper(sf.kern)
	if sf.kp == nil {
		sf.t.Errorf("createGood1(): keep==nil")
	}
}

// Нет объекта приложения
func (sf *tester) createBad1() {
	defer func() {
		if _panic := recover(); _panic == nil {
			sf.t.Errorf("createBad1(: panic==nil\n")
		}
		if sf.kp != nil {
			sf.t.Errorf("createBad1(): keep!=nil")
		}
	}()
	sf.kp = NewKeeper(nil)
}
