veyron/lib/testutil: make sure we seed rand exactly once.

Change-Id: I72e86d9038cd7b7fe33788ef72a78b662aaabdff
diff --git a/lib/testutil/init.go b/lib/testutil/init.go
index c8aaf5d..794ec5a 100644
--- a/lib/testutil/init.go
+++ b/lib/testutil/init.go
@@ -14,6 +14,7 @@
 	"strconv"
 	"sync"
 	"time"
+
 	"veyron.io/veyron/veyron2/vlog"
 )
 
@@ -47,6 +48,7 @@
 }
 
 var Rand *Random
+var once sync.Once
 
 // Init sets up state for running tests: Adjusting GOMAXPROCS,
 // configuring the vlog logging library, setting up the random number generator
@@ -56,28 +58,32 @@
 // flags. Thus, it is NOT a good idea to call this from the init() function
 // of any module except "main" or _test.go files.
 func Init() {
-	if os.Getenv("GOMAXPROCS") == "" {
-		// Set the number of logical processors to the number of CPUs,
-		// if GOMAXPROCS is not set in the environment.
-		runtime.GOMAXPROCS(runtime.NumCPU())
-	}
-	// At this point all of the flags that we're going to use for
-	// tests must be defined.
-	// This will be the case if this is called from the init()
-	// function of a _test.go file.
-	flag.Parse()
-	vlog.ConfigureLibraryLoggerFromFlags()
-	// Initialize pseudo-random number generator.
-	seed := time.Now().UnixNano()
-	seedString := os.Getenv(SeedEnv)
-	if seedString != "" {
-		var err error
-		base, bitSize := 0, 64
-		seed, err = strconv.ParseInt(seedString, base, bitSize)
-		if err != nil {
-			vlog.Fatalf("ParseInt(%v, %v, %v) failed: %v", seedString, base, bitSize, err)
+	init := func() {
+		if os.Getenv("GOMAXPROCS") == "" {
+			// Set the number of logical processors to the number of CPUs,
+			// if GOMAXPROCS is not set in the environment.
+			runtime.GOMAXPROCS(runtime.NumCPU())
 		}
+		// At this point all of the flags that we're going to use for
+		// tests must be defined.
+		// This will be the case if this is called from the init()
+		// function of a _test.go file.
+		flag.Parse()
+		vlog.ConfigureLibraryLoggerFromFlags()
+
+		// Initialize pseudo-random number generator.
+		seed := time.Now().UnixNano()
+		seedString := os.Getenv(SeedEnv)
+		if seedString != "" {
+			var err error
+			base, bitSize := 0, 64
+			seed, err = strconv.ParseInt(seedString, base, bitSize)
+			if err != nil {
+				vlog.Fatalf("ParseInt(%v, %v, %v) failed: %v", seedString, base, bitSize, err)
+			}
+		}
+		vlog.Infof("Seeding pseudo-random number generator with %v", seed)
+		Rand = &Random{rand: rand.New(rand.NewSource(seed))}
 	}
-	vlog.Infof("Seeding pseudo-random number generator with %v", seed)
-	Rand = &Random{rand: rand.New(rand.NewSource(seed))}
+	once.Do(init)
 }
diff --git a/services/mgmt/node/impl/impl_test.go b/services/mgmt/node/impl/impl_test.go
index 51576fd..170d8cc 100644
--- a/services/mgmt/node/impl/impl_test.go
+++ b/services/mgmt/node/impl/impl_test.go
@@ -235,6 +235,9 @@
 	if err := server.Serve(publishName, new(appService), nil); err != nil {
 		vlog.Fatalf("Serve(%v) failed: %v", publishName, err)
 	}
+	// Some of our tests look for log files, so make sure they are flushed
+	// to ensure that at least the files exist.
+	vlog.FlushLog()
 	ping()
 
 	<-signals.ShutdownOnSignals()