package util import ( "strings" "testing" ) // ExecProbe отличает «команда ответила ненулевым кодом» от «команду не удалось // запустить». // // Проверка нужна потому, что на этом различии стоит диагностика службы: // `systemctl is-active` отвечает словом состояния в stdout И кодом возврата 3, // а Exec выбрасывает вывод при любом ненулевом коде. Пока другого примитива не // было, «служба неактивна» и «спросить не получилось» приходили в панель одним // и тем же значением. // // Продуктовая среда — Linux, поэтому проверка требует рабочего bash. Там, где // его нет (машина разработчика под Windows), она пропускается: подменять здесь // запуск процесса нечем — именно поведение запуска и проверяется. func requireShell(t *testing.T) { t.Helper() if _, err := Exec("true"); err != nil { t.Skip("bash недоступен в этой среде: проверка запуска процесса пропущена") } } func TestExecProbeReturnsOutputWithNonZeroExitCode(t *testing.T) { requireShell(t) output, code, err := ExecProbe("echo inactive; exit 3") if err != nil { t.Fatalf("ненулевой код возврата признан отказом запуска: %v", err) } if code != 3 { t.Fatalf("код возврата %d, ожидался 3", code) } if strings.TrimSpace(output) != "inactive" { t.Fatalf("вывод потерян: %q", output) } } func TestExecProbeReturnsZeroExitCode(t *testing.T) { requireShell(t) output, code, err := ExecProbe("echo active") if err != nil { t.Fatalf("успешная команда признана отказом: %v", err) } if code != 0 { t.Fatalf("код возврата %d, ожидался 0", code) } if strings.TrimSpace(output) != "active" { t.Fatalf("вывод потерян: %q", output) } } // Отсутствующий интерпретатор — это уже отказ запуска, а не ответ команды. func TestExecProbeReportsLaunchFailure(t *testing.T) { requireShell(t) _, _, err := ExecProbe("hy2xs-no-such-command-ever") // bash отвечает кодом 127: команда не найдена — это ОТВЕТ оболочки, а не // отказ запуска, поэтому ошибки здесь быть не должно. if err != nil { t.Fatalf("ответ оболочки 127 признан отказом запуска: %v", err) } }