//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) }}//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)
}
}