//go:build !windows package cli import ( "context" "os" "path/filepath" "strings" "testing" "time" ) func TestRunGitKillsChildProcessGroupOnContextCancel(t *testing.T) { dir := t.TempDir() gitPath := filepath.Join(dir, "git") script := "#!/bin/sh\n(sleep 30) &\nwait\n" if err := os.WriteFile(gitPath, []byte(script), 0o755); err != nil { t.Fatalf("write fake git: %v", err) } t.Setenv("PATH", dir+string(os.PathListSeparator)+os.Getenv("PATH")) ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) defer cancel() start := time.Now() err := runGit(ctx, "", "fetch") elapsed := time.Since(start) if err == nil { t.Fatal("expected context cancellation error") } if !strings.Contains(err.Error(), "context deadline exceeded") { t.Fatalf("error = %v, want context deadline exceeded", err) } if elapsed > 2*time.Second { t.Fatalf("runGit took %s after context cancellation", elapsed) } }