feat(admin): авто-сброс эмуляторов НРД/МНП при окончании режима разработки
Если оператор временно получил dev-режим, включил эмулятор и забыл — при окончании dev-режима флаги LK.EmulateNSD и QuikMNP.Emulate сбрасываются насовсем (а не просто перестают действовать): при следующей выдаче dev-режима эмуляторы молча не оживут. Проверка disableEmulatorsIfDevOff вызывается при старте сервера (после продления лицензии) и на каждом проходе цикла продления — ловит истечение dev и по времени, без продления. При сбросе — запись в ленту событий: «Эмуляторы отключены: режим разработки закончился» с перечнем выключенного; если был включён эмулятор МНП при WritesEnabled=false — предупреждение, что цикл МНП остановлен и для боевой работы нужно включить запись.
This commit is contained in:
@@ -9,6 +9,8 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"git.zetit.ru/zuevav/Bridge-and-Join-s/internal/license"
|
||||
)
|
||||
|
||||
// Настройки эмуляторов: валидация и обратная совместимость (старый setup.json без полей = дефолты).
|
||||
@@ -206,3 +208,96 @@ func TestMNPEmuStepDelayCtx(t *testing.T) {
|
||||
t.Fatal("задержка не прервалась по контексту")
|
||||
}
|
||||
}
|
||||
|
||||
// rcWithExpiredDev — действующая лицензия с истёкшим dev_until: devMode уже false.
|
||||
func rcWithExpiredDev(t *testing.T) *RuntimeConfig {
|
||||
t.Helper()
|
||||
priv := testLicenseKey(t)
|
||||
rc := testRC(t)
|
||||
past := time.Now().UTC().Add(-time.Hour)
|
||||
tok := signTestLicense(t, priv, &license.License{Schema: 1, ID: "lic-dev", Tenant: "Тест", Product: "bj-server", Plan: license.PlanPro,
|
||||
IssuedAt: past.Add(-24 * time.Hour), ExpiresAt: time.Now().UTC().Add(60 * 24 * time.Hour), DevUntil: &past})
|
||||
if err := rc.SaveLicense(LicenseSettings{Key: tok}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if devMode(rc) {
|
||||
t.Fatal("devMode с истёкшим dev_until должен быть выключен")
|
||||
}
|
||||
return rc
|
||||
}
|
||||
|
||||
// dev-режим закончился: включённые эмуляторы сбрасываются из настроек, про это — новость.
|
||||
func TestDisableEmulatorsIfDevOff(t *testing.T) {
|
||||
rc := rcWithExpiredDev(t)
|
||||
s := rc.Snapshot()
|
||||
s.LK.EmulateNSD = true
|
||||
if err := rc.UpdateLK(s.LK); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
s.Quik.Emulate = true
|
||||
if err := rc.UpdateQuik(s.Quik); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
disableEmulatorsIfDevOff(rc)
|
||||
if s := rc.Snapshot(); s.LK.EmulateNSD || s.Quik.Emulate {
|
||||
t.Fatalf("флаги не сброшены: EmulateNSD=%v Quik.Emulate=%v", s.LK.EmulateNSD, s.Quik.Emulate)
|
||||
}
|
||||
// setup.json на диске тоже без флагов — при следующем dev-режиме эмуляторы не оживут.
|
||||
rc2, err := NewRuntimeConfig(rc.path)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if s := rc2.Snapshot(); s.LK.EmulateNSD || s.Quik.Emulate {
|
||||
t.Fatal("в setup.json флаги остались включёнными")
|
||||
}
|
||||
found := false
|
||||
for _, n := range rc.Snapshot().News.Items {
|
||||
if strings.Contains(n.Title, "Эмуляторы отключены") {
|
||||
found = true
|
||||
if !strings.Contains(n.Body, "эмулятор НРД") || !strings.Contains(n.Body, "эмулятор МНП") {
|
||||
t.Errorf("в новости не перечислено, что выключено: %s", n.Body)
|
||||
}
|
||||
// WritesEnabled=false — новость предупреждает об остановленном цикле МНП.
|
||||
if !strings.Contains(n.Body, "Цикл M2M в МНП остановлен") {
|
||||
t.Errorf("нет предупреждения об остановленном цикле МНП: %s", n.Body)
|
||||
}
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
t.Error("новость об отключении эмуляторов не добавлена")
|
||||
}
|
||||
}
|
||||
|
||||
// dev-режим действует: авто-сброс ничего не трогает.
|
||||
func TestDisableEmulatorsIfDevOffDevOn(t *testing.T) {
|
||||
devModeForced = true
|
||||
defer func() { devModeForced = false }()
|
||||
rc := testRC(t)
|
||||
s := rc.Snapshot()
|
||||
s.LK.EmulateNSD = true
|
||||
s.Quik.Emulate = true
|
||||
if err := rc.UpdateLK(s.LK); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := rc.UpdateQuik(s.Quik); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
disableEmulatorsIfDevOff(rc)
|
||||
if s := rc.Snapshot(); !s.LK.EmulateNSD || !s.Quik.Emulate {
|
||||
t.Fatal("при действующем dev-режиме флаги не должны сбрасываться")
|
||||
}
|
||||
}
|
||||
|
||||
// dev выключен, но флаги уже сняты: no-op — настройки не переписываются, новости нет.
|
||||
func TestDisableEmulatorsIfDevOffNoOp(t *testing.T) {
|
||||
rc := rcWithExpiredDev(t)
|
||||
before := rc.Snapshot().UpdatedAt
|
||||
disableEmulatorsIfDevOff(rc)
|
||||
after := rc.Snapshot()
|
||||
if !after.UpdatedAt.Equal(before) {
|
||||
t.Error("no-op не должен переписывать setup.json")
|
||||
}
|
||||
if len(after.News.Items) != 0 {
|
||||
t.Error("no-op не должен добавлять новость")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user