package keeper

import (
	"os"
	"syscall"
	"testing"
	"time"
	"wartank/pkg/components/kernel/slog"
	"wartank/pkg/mock/mock_env"
	"wartank/pkg/mock/mockkernel"
	"wartank/pkg/types"
)

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

// Тестер для сторожа
type tester struct {
	t    *testing.T
	err  error
	me   *mock_env.МокОкружение
	kp   *Сторож
	kern types.ИЯдро
}

func TestKeeper(t *testing.T) {
	test := &tester{
		t:  t,
		me: mock_env.НовМокОкружение(),
	}
	test.create()
	test.cancel()
	_ = os.RemoveAll("./log")
}

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

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

func (сам *tester) createGood1() {
	defer func() {
		if _panic := recover(); _panic != nil {
			сам.t.Errorf("createGood1(: panic=\n\t%v\n", _panic)
		}
	}()
	сам.me.Unset()
	if err := сам.me.ИнитЛокал(); err != nil {
		сам.t.Errorf("createGood1(): не локальное окружение, err=\n\t%v\n", err)
		return
	}
	сам.kern = mockkernel.NewMockKernel()
	ядро := сам.kern.(*mockkernel.MockKernel)
	ядро.Slog_, сам.err = slog.НовСлог(сам.kern)
	if сам.err != nil {
		сам.t.Errorf("createGood1(): in create ISlog, err=\n\t%v", сам.err)
	}
	сам.kp = НовСторож(сам.kern)
	if сам.kp == nil {
		сам.t.Errorf("createGood1(): keep==nil")
	}
}

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