Merge pull request #8 from hobbyistlabs-coder/jules-1676853776860179272-da76641e

🧪 Add tests for gateway process lifecycle commands
This commit is contained in:
hobbyistlabs-coder 2026-03-13 15:41:14 -04:00 committed by GitHub
commit 69fa0955d6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 139 additions and 4 deletions

View file

@ -5,12 +5,14 @@ package ui
import "os/exec" import "os/exec"
var execCommand = exec.Command
func isGatewayProcessRunning() bool { func isGatewayProcessRunning() bool {
cmd := exec.Command("sh", "-c", "pgrep -f 'picoclaw\\s+gateway' >/dev/null 2>&1") cmd := execCommand("sh", "-c", "pgrep -f 'picoclaw\\s+gateway' >/dev/null 2>&1")
return cmd.Run() == nil return cmd.Run() == nil
} }
func stopGatewayProcess() error { func stopGatewayProcess() error {
cmd := exec.Command("sh", "-c", "pkill -f 'picoclaw\\s+gateway' >/dev/null 2>&1") cmd := execCommand("sh", "-c", "pkill -f 'picoclaw\\s+gateway' >/dev/null 2>&1")
return cmd.Run() return cmd.Run()
} }

View file

@ -5,12 +5,14 @@ package ui
import "os/exec" import "os/exec"
var execCommand = exec.Command
func isGatewayProcessRunning() bool { func isGatewayProcessRunning() bool {
cmd := exec.Command("tasklist", "/FI", "IMAGENAME eq picoclaw.exe") cmd := execCommand("tasklist", "/FI", "IMAGENAME eq picoclaw.exe")
return cmd.Run() == nil return cmd.Run() == nil
} }
func stopGatewayProcess() error { func stopGatewayProcess() error {
cmd := exec.Command("taskkill", "/F", "/IM", "picoclaw.exe") cmd := execCommand("taskkill", "/F", "/IM", "picoclaw.exe")
return cmd.Run() return cmd.Run()
} }

View file

@ -0,0 +1,131 @@
//go:build windows
// +build windows
package ui
import (
"os"
"os/exec"
"reflect"
"strconv"
"testing"
)
func TestIsGatewayProcessRunning(t *testing.T) {
origExecCommand := execCommand
defer func() { execCommand = origExecCommand }()
tests := []struct {
name string
exitCode int
wantResult bool
}{
{
name: "running",
exitCode: 0,
wantResult: true,
},
{
name: "not running",
exitCode: 1,
wantResult: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var gotName string
var gotArgs []string
execCommand = func(name string, args ...string) *exec.Cmd {
gotName = name
gotArgs = args
cmd := exec.Command(os.Args[0], "-test.run=TestHelperProcess", "--")
cmd.Env = append(os.Environ(),
"GO_WANT_HELPER_PROCESS=1",
"GO_WANT_HELPER_PROCESS_EXIT_CODE="+strconv.Itoa(tt.exitCode),
)
return cmd
}
got := isGatewayProcessRunning()
if got != tt.wantResult {
t.Errorf("isGatewayProcessRunning() = %v, want %v", got, tt.wantResult)
}
if gotName != "tasklist" {
t.Errorf("expected command name tasklist, got %s", gotName)
}
expectedArgs := []string{"/FI", "IMAGENAME eq picoclaw.exe"}
if !reflect.DeepEqual(gotArgs, expectedArgs) {
t.Errorf("expected args %v, got %v", expectedArgs, gotArgs)
}
})
}
}
func TestStopGatewayProcess(t *testing.T) {
origExecCommand := execCommand
defer func() { execCommand = origExecCommand }()
tests := []struct {
name string
exitCode int
wantErr bool
}{
{
name: "success",
exitCode: 0,
wantErr: false,
},
{
name: "failure",
exitCode: 1,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var gotName string
var gotArgs []string
execCommand = func(name string, args ...string) *exec.Cmd {
gotName = name
gotArgs = args
cmd := exec.Command(os.Args[0], "-test.run=TestHelperProcess", "--")
cmd.Env = append(os.Environ(),
"GO_WANT_HELPER_PROCESS=1",
"GO_WANT_HELPER_PROCESS_EXIT_CODE="+strconv.Itoa(tt.exitCode),
)
return cmd
}
err := stopGatewayProcess()
if (err != nil) != tt.wantErr {
t.Errorf("stopGatewayProcess() error = %v, wantErr %v", err, tt.wantErr)
}
if gotName != "taskkill" {
t.Errorf("expected command name taskkill, got %s", gotName)
}
expectedArgs := []string{"/F", "/IM", "picoclaw.exe"}
if !reflect.DeepEqual(gotArgs, expectedArgs) {
t.Errorf("expected args %v, got %v", expectedArgs, gotArgs)
}
})
}
}
func TestHelperProcess(t *testing.T) {
if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
return
}
defer os.Exit(0)
if code := os.Getenv("GO_WANT_HELPER_PROCESS_EXIT_CODE"); code != "" {
c, _ := strconv.Atoi(code)
os.Exit(c)
}
os.Exit(0)
}