veyron/lib/exec: fix potential race with TestWaitAndCleanRace and clean up logging
I saw the failure below, and I think it may be related to the fact that I used
the wrong command (testReadySlow) for the test:
16:04:32 --- FAIL: TestWaitAndCleanRace (0.01 seconds)
16:04:32 exec_test.go:429: Wait returned exit status 1, wanted timeout waiting for child instead
I am now adding a new command that does what we want (namely, come up and wait
"forever").
While at it, also clean up all the log.Fatalf(os.Stderr, ...).
Change-Id: Ib2c35dff32d40b35566bdf55f98f83e4e34fa6ce
diff --git a/lib/exec/exec_test.go b/lib/exec/exec_test.go
index a013d55..a1e77db 100644
--- a/lib/exec/exec_test.go
+++ b/lib/exec/exec_test.go
@@ -411,13 +411,12 @@
}
func TestWaitAndCleanRace(t *testing.T) {
- name := "TestWaitAndCleanRace"
- cmd := helperCommand("testReadySlow")
+ name := "testReadyAndHang"
+ cmd := helperCommand(name)
tk := timekeeper.NewManualTime()
ph := vexec.NewParentHandle(cmd, vexec.TimeKeeperOpt{tk})
- err := ph.Start()
- if err != nil {
- t.Fatalf("%s: start: %v", name, err)
+ if err := waitForReady(t, cmd, name, 1, ph); err != nil {
+ t.Errorf("%s: WaitForReady: %v (%v)", name, err, ph)
}
go func() {
// Wait for the ph.Wait below to block, then advance the time
@@ -426,17 +425,17 @@
tk.AdvanceTime(2 * time.Second)
}()
if got, want := ph.Wait(time.Second), vexec.ErrTimeout; got == nil || got.Error() != want.Error() {
- t.Fatalf("Wait returned %v, wanted %v instead", got, want)
+ t.Errorf("Wait returned %v, wanted %v instead", got, want)
}
if got, want := ph.Clean(), "signal: killed"; got == nil || got.Error() != want {
- t.Fatalf("Wait returned %v, wanted %v instead", got, want)
+ t.Errorf("Wait returned %v, wanted %v instead", got, want)
}
}
func verifyNoExecVariable() {
version := os.Getenv(vexec.VersionVariable)
if len(version) != 0 {
- log.Fatal(os.Stderr, "Version variable %q has a value: %s", vexec.VersionVariable, version)
+ log.Fatalf("Version variable %q has a value: %s", vexec.VersionVariable, version)
}
}
@@ -452,7 +451,7 @@
version := os.Getenv(vexec.VersionVariable)
if len(version) == 0 {
- log.Fatal(os.Stderr, "Version variable %q has no value", vexec.VersionVariable)
+ log.Fatalf("Version variable %q has no value", vexec.VersionVariable)
}
// Write errors to stderr or using log. since the parent
@@ -467,7 +466,7 @@
}
if len(args) == 0 {
- log.Fatal(os.Stderr, "No command\n")
+ log.Fatal("No command")
}
cmd, args := args[0], args[1:]
@@ -476,20 +475,20 @@
case "exitEarly":
_, err := vexec.GetChildHandle()
if err != nil {
- log.Fatal(os.Stderr, "%s\n", err)
+ log.Fatal(err)
}
os.Exit(1)
case "testNeverReady":
_, err := vexec.GetChildHandle()
if err != nil {
- log.Fatal(os.Stderr, "%s\n", err)
+ log.Fatal(err)
}
verifyNoExecVariable()
fmt.Fprintf(os.Stderr, "never ready")
case "testTooSlowToReady":
ch, err := vexec.GetChildHandle()
if err != nil {
- log.Fatal(os.Stderr, "%s\n", err)
+ log.Fatal(err)
}
verifyNoExecVariable()
// Wait for the parent to tell us when it's ok to proceed.
@@ -498,7 +497,7 @@
buf := make([]byte, 100)
n, err := controlPipe.Read(buf)
if err != nil {
- log.Fatal(os.Stderr, "%s", err)
+ log.Fatal(err)
}
if n > 0 {
break
@@ -511,11 +510,10 @@
} else {
fmt.Fprintf(os.Stderr, "didn't get the expected error")
}
- os.Exit(0)
case "testFail":
ch, err := vexec.GetChildHandle()
if err != nil {
- log.Fatal(os.Stderr, "%s", err)
+ log.Fatal(err)
}
verifyNoExecVariable()
if err := ch.SetFailed(fmt.Errorf("%s", strings.Join(args, " "))); err != nil {
@@ -525,7 +523,7 @@
case "testReady":
ch, err := vexec.GetChildHandle()
if err != nil {
- log.Fatal(os.Stderr, "%s", err)
+ log.Fatal(err)
}
verifyNoExecVariable()
ch.SetReady()
@@ -533,7 +531,7 @@
case "testReadySlow":
ch, err := vexec.GetChildHandle()
if err != nil {
- log.Fatal(os.Stderr, "%s", err)
+ log.Fatal(err)
}
verifyNoExecVariable()
// Wait for the parent to tell us when it's ok to proceed.
@@ -542,7 +540,7 @@
buf := make([]byte, 100)
n, err := controlPipe.Read(buf)
if err != nil {
- log.Fatal(os.Stderr, "%s", err)
+ log.Fatal(err)
}
if n > 0 {
break
@@ -550,10 +548,18 @@
}
ch.SetReady()
fmt.Fprintf(os.Stderr, "..")
+ case "testReadyAndHang":
+ ch, err := vexec.GetChildHandle()
+ if err != nil {
+ log.Fatal(err)
+ }
+ verifyNoExecVariable()
+ ch.SetReady()
+ <-time.After(time.Minute)
case "testSuccess", "testError":
ch, err := vexec.GetChildHandle()
if err != nil {
- log.Fatal(os.Stderr, "%s\n", err)
+ log.Fatal(err)
}
verifyNoExecVariable()
ch.SetReady()
@@ -592,7 +598,7 @@
case "testExtraFiles":
ch, err := vexec.GetChildHandle()
if err != nil {
- log.Fatal("error.... %s\n", err)
+ log.Fatalf("error.... %s\n", err)
}
verifyNoExecVariable()
err = ch.SetReady()
@@ -603,6 +609,5 @@
} else {
fmt.Fprintf(os.Stderr, "child: %s", string(buf[:n]))
}
- os.Exit(0)
}
}