mirror of https://github.com/liamg/aminal.git
51 lines
1.1 KiB
Go
51 lines
1.1 KiB
Go
package w32
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"path"
|
|
"strconv"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
var forkFn = path.Join(os.TempDir(), "forktest.pid")
|
|
|
|
func TestFork(t *testing.T) {
|
|
|
|
ppid := os.Getpid()
|
|
t.Logf("[OK] I am PID %d", ppid)
|
|
pid, err := Fork()
|
|
if err != nil {
|
|
t.Fatalf("[!!] Failed to fork. PID: %d: %s", pid, err)
|
|
}
|
|
|
|
if pid == 0 {
|
|
// We can't log anything here because our stdout doesn't point
|
|
// to the same console as our parent.
|
|
//
|
|
// This process won't show up in Task Manager, and os.Getpid() won't
|
|
// work, I guess because we haven't told CSRSS we exist.
|
|
f, _ := os.Create(forkFn)
|
|
f.WriteString(fmt.Sprintf("%d", ppid))
|
|
f.Close()
|
|
} else {
|
|
t.Logf("[OK] Forked child with PID %d", pid)
|
|
t.Logf("[OK] Sleeping, then trying to read checkfile.")
|
|
time.Sleep(2 * time.Second)
|
|
raw, err := ioutil.ReadFile(forkFn)
|
|
if err != nil {
|
|
t.Fatalf("[!!] Failed to read PID checkfile: %s", err)
|
|
}
|
|
if string(raw) == strconv.Itoa(ppid) {
|
|
t.Logf("[OK] Found PID checkfile - PID matches!")
|
|
} else {
|
|
t.Errorf("[!] Child reported PID %q vs %q!", string(raw), strconv.Itoa(ppid))
|
|
}
|
|
os.Remove(forkFn)
|
|
|
|
}
|
|
|
|
}
|