Multiple changes to the test framework. Interim commit
to avoid losing code if my VM crashes

Change-Id: I5f03db81851dba1fb0c944c8e5f3a845ddbec2c8
diff --git a/tests/afrouter/templates/runTests.go b/tests/afrouter/templates/runTests.go
index 3b0f6d4..2c65f09 100644
--- a/tests/afrouter/templates/runTests.go
+++ b/tests/afrouter/templates/runTests.go
@@ -18,10 +18,10 @@
 package main
 
 import (
-	"fmt"
-	"time"
 	"errors"
 	"encoding/json"
+	"golang.org/x/net/context"
+	"google.golang.org/grpc/metadata"
 	"github.com/opencord/voltha-go/common/log"
 	{{range .Imports}}
 	_ "{{.}}"
@@ -31,22 +31,40 @@
 	{{end}}
 )
 
+func resetChannels() {
+	// Drain all channels of data
+	for _,v := range servers {
+		done := false
+		for {
+			select {
+			case _ = <-v.incmg:
+			case _ = <-v.replyData:
+			default:
+				done = true
+			}
+			if done == true {
+				break
+			}
+		}
+	}
+}
+
 func runTests() {
 	{{range $k,$v := .Tests}}
 	if err := test{{$k}}(); err == nil {
-		resFile.Write([]byte("\tTest Successful\n"))
+		resFile.testLog("\tTest Successful\n")
 	} else {
-		resFile.Write([]byte("\tTest Failed\n"))
+		resFile.testLog("\tTest Failed\n")
 	}
+	resetChannels()
 	{{end}}
-	time.Sleep(5 * time.Second)
 }
 
 {{range $k,$v := .Tests}}
 func test{{$k}}() error {
 	var rtrn error = nil
 	// Announce the test being run
-	resFile.Write([]byte("******************** Running test case: {{$v.Name}}\n"))
+	resFile.testLog("******************** Running test case: {{$v.Name}}\n")
 	// Acquire the client used to run the test
 	cl := clients["{{$v.Send.Client}}"]
 	// Create the server's reply data structure
@@ -54,19 +72,36 @@
 	// Send the reply data structure to each of the servers
 	{{range $s := .Srvr}}
 	if servers["{{$s.Name}}"] == nil {
-		log.Error("Server '{{$s.Name}}' is nil")
-		return errors.New("GAAK")
+		err := errors.New("Server '{{$s.Name}}' is nil")
+		log.Error(err)
+		return err
 	}
-	servers["{{$s.Name}}"].replyData <- repl
+	select {
+	case servers["{{$s.Name}}"].replyData <- repl:
+	default:
+		err := errors.New("Could not provide server {{$s.Name}} with reply data")
+		log.Error(err)
+		return err
+	}
 	{{end}}
 
 	// Now call the RPC with the data provided
 	if expct,err := json.Marshal(repl.repl); err != nil {
 		log.Errorf("Marshaling the reply for test {{$v.Name}}: %v",err)
 	} else {
-		if err := cl.send("{{$v.Send.Method}}",
+		// Create the context for the call
+		ctx := context.Background()
+		{{range $m := $v.Send.MetaData}}
+		ctx = metadata.AppendToOutgoingContext(ctx, "{{$m.Key}}", "{{$m.Val}}")
+		{{end}}
+		var md map[string]string = make(map[string]string)
+		{{range $m := $v.Send.ExpectMeta}}
+			md["{{$m.Key}}"] = "{{$m.Val}}"
+		{{end}}
+		expectMd := metadata.New(md)
+		if err := cl.send("{{$v.Send.Method}}", ctx,
 							&{{$v.Send.ParamType}}{{$v.Send.Param}},
-							string(expct)); err != nil {
+							string(expct), expectMd); err != nil {
 			log.Errorf("Test case {{$v.Name}} failed!: %v", err)
 
 		}
@@ -83,22 +118,27 @@
 	}
 	{{range $s := .Srvr}}
 	s = servers["{{$s.Name}}"]
-	i = <-s.incmg
-	if i.payload != payload {
-		log.Errorf("Mismatched payload for test {{$v.Name}}, %s:%s", i.payload, payload)
-		resFile.Write([]byte(fmt.Sprintf("Mismatched payload expected %s, got %s\n", payload, i.payload)))
-		rtrn = errors.New("Failed")
-	}
-	{{range $m := $s.Meta}}
-	if mv,ok := i.meta["{{$m.Key}}"]; ok == true {
-		if "{{$m.Val}}" != mv[0] {
-			log.Errorf("Mismatched metadata for test {{$v.Name}}, %s:%s", mv[0], "{{$m.Val}}")
-			resFile.Write([]byte(fmt.Sprintf("Mismatched metadata on server %s expected %s, got %s\n", "{{$s.Name}}", "{{$m.Val}}", mv[0])))
+	select {
+	case i = <-s.incmg:
+		if i.payload != payload {
+			log.Errorf("Mismatched payload for test {{$v.Name}}, %s:%s", i.payload, payload)
+			resFile.testLog("Mismatched payload expected '%s', got '%s'\n", payload, i.payload)
 			rtrn = errors.New("Failed")
 		}
+		{{range $m := $s.Meta}}
+		if mv,ok := i.meta["{{$m.Key}}"]; ok == true {
+			if "{{$m.Val}}" != mv[0] {
+				log.Errorf("Mismatched metadata for test {{$v.Name}}, %s:%s", mv[0], "{{$m.Val}}")
+				resFile.testLog("Mismatched metadata on server '%s' expected '%s', got '%s'\n", "{{$s.Name}}", "{{$m.Val}}", mv[0])
+				rtrn = errors.New("Failed")
+			}
+		}
+		{{end}}
+	default:
+		err := errors.New("No response data available for server {{$s.Name}}")
+		log.Error(err)
 	}
 	{{end}}
-	{{end}}
 
 	return rtrn
 }