package compose import ( "os" "strings" "testing" ) func TestWindowsTerminationOwnsTheProcessTreeWithAKillOnCloseJobObjectWithoutAShell(t *testing.T) { source, err := os.ReadFile("process_windows.go") if err != nil { t.Fatal(err) } text := string(source) for _, required := range []string{ "windows.CreateJobObject", "windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION", "windows.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE", "windows.SetInformationJobObject", "windows.AssignProcessToJobObject", "windows.TerminateJobObject", "windows.OpenProcess", "windows.CreateToolhelp32Snapshot", "windows.ResumeThread", "windows.CloseHandle", "createSuspendedProcess", } { if !strings.Contains(text, required) { t.Errorf("process_windows.go is missing %q", required) } } for _, forbidden := range []string{ "taskkill", "cmd.exe", "powershell", "exec.Command(", "exec.CommandContext(", "exec.LookPath(", "windows.GetSystemDirectory", } { if strings.Contains(strings.ToLower(text), strings.ToLower(forbidden)) { t.Errorf("process_windows.go contains unsafe or unowned process-tree mechanism %q", forbidden) } } }