mirror of
https://github.com/cexll/myclaude.git
synced 2026-02-05 02:30:26 +08:00
- Move all source files to internal/{app,backend,config,executor,logger,parser,utils}
- Integrate third-party libraries: zerolog, goccy/go-json, gopsutil, cobra/viper
- Add comprehensive unit tests for utils package (94.3% coverage)
- Add performance benchmarks for string operations
- Fix error display: cleanup warnings no longer pollute Recent Errors
- Add GitHub Actions CI workflow
- Add Makefile for build automation
- Add README documentation
Generated with SWE-Agent.ai
Co-Authored-By: SWE-Agent.ai <noreply@swe-agent.ai>
113 lines
2.8 KiB
Go
113 lines
2.8 KiB
Go
package logger
|
|
|
|
import (
|
|
"math"
|
|
"os"
|
|
"os/exec"
|
|
"runtime"
|
|
"strconv"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestIsProcessRunning(t *testing.T) {
|
|
t.Run("boundary values", func(t *testing.T) {
|
|
if isProcessRunning(0) {
|
|
t.Fatalf("pid 0 should never be treated as running")
|
|
}
|
|
if isProcessRunning(-1) {
|
|
t.Fatalf("negative pid should never be treated as running")
|
|
}
|
|
})
|
|
|
|
t.Run("pid out of int32 range", func(t *testing.T) {
|
|
if strconv.IntSize <= 32 {
|
|
t.Skip("int cannot represent values above int32 range")
|
|
}
|
|
|
|
pid := int(int64(math.MaxInt32) + 1)
|
|
if isProcessRunning(pid) {
|
|
t.Fatalf("expected pid %d (out of int32 range) to be treated as not running", pid)
|
|
}
|
|
})
|
|
|
|
t.Run("current process", func(t *testing.T) {
|
|
if !isProcessRunning(os.Getpid()) {
|
|
t.Fatalf("expected current process (pid=%d) to be running", os.Getpid())
|
|
}
|
|
})
|
|
|
|
t.Run("fake pid", func(t *testing.T) {
|
|
const nonexistentPID = 1 << 30
|
|
if isProcessRunning(nonexistentPID) {
|
|
t.Fatalf("expected pid %d to be reported as not running", nonexistentPID)
|
|
}
|
|
})
|
|
|
|
t.Run("terminated process", func(t *testing.T) {
|
|
pid := exitedProcessPID(t)
|
|
if isProcessRunning(pid) {
|
|
t.Fatalf("expected exited child process (pid=%d) to be reported as not running", pid)
|
|
}
|
|
})
|
|
}
|
|
|
|
func exitedProcessPID(t *testing.T) int {
|
|
t.Helper()
|
|
|
|
var cmd *exec.Cmd
|
|
if runtime.GOOS == "windows" {
|
|
cmd = exec.Command("cmd", "/c", "exit 0")
|
|
} else {
|
|
cmd = exec.Command("sh", "-c", "exit 0")
|
|
}
|
|
|
|
if err := cmd.Start(); err != nil {
|
|
t.Fatalf("failed to start helper process: %v", err)
|
|
}
|
|
pid := cmd.Process.Pid
|
|
|
|
if err := cmd.Wait(); err != nil {
|
|
t.Fatalf("helper process did not exit cleanly: %v", err)
|
|
}
|
|
|
|
time.Sleep(50 * time.Millisecond)
|
|
return pid
|
|
}
|
|
|
|
func TestGetProcessStartTimeReadsProcStat(t *testing.T) {
|
|
start := getProcessStartTime(os.Getpid())
|
|
if start.IsZero() {
|
|
t.Fatalf("expected non-zero start time for current process")
|
|
}
|
|
if start.After(time.Now().Add(5 * time.Second)) {
|
|
t.Fatalf("start time is unexpectedly in the future: %v", start)
|
|
}
|
|
}
|
|
|
|
func TestGetProcessStartTimeInvalidData(t *testing.T) {
|
|
if !getProcessStartTime(0).IsZero() {
|
|
t.Fatalf("expected zero time for pid 0")
|
|
}
|
|
if !getProcessStartTime(-1).IsZero() {
|
|
t.Fatalf("expected zero time for negative pid")
|
|
}
|
|
if !getProcessStartTime(1 << 30).IsZero() {
|
|
t.Fatalf("expected zero time for non-existent pid")
|
|
}
|
|
if strconv.IntSize > 32 {
|
|
pid := int(int64(math.MaxInt32) + 1)
|
|
if !getProcessStartTime(pid).IsZero() {
|
|
t.Fatalf("expected zero time for pid %d (out of int32 range)", pid)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestGetBootTimeParsesBtime(t *testing.T) {
|
|
t.Skip("legacy boot-time probing removed; start time now uses gopsutil")
|
|
}
|
|
|
|
func TestGetBootTimeInvalidData(t *testing.T) {
|
|
t.Skip("legacy boot-time probing removed; start time now uses gopsutil")
|
|
}
|