diff options
Diffstat (limited to 'vendor/github.com/AllenDang/w32/fork_test.go')
-rw-r--r-- | vendor/github.com/AllenDang/w32/fork_test.go | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/vendor/github.com/AllenDang/w32/fork_test.go b/vendor/github.com/AllenDang/w32/fork_test.go new file mode 100644 index 0000000..47b52ba --- /dev/null +++ b/vendor/github.com/AllenDang/w32/fork_test.go @@ -0,0 +1,50 @@ +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) + + } + +} |