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/client.go b/tests/afrouter/templates/client.go
index d384baf..8cd3330 100644
--- a/tests/afrouter/templates/client.go
+++ b/tests/afrouter/templates/client.go
@@ -22,6 +22,7 @@
 	"encoding/json"
 	"google.golang.org/grpc"
 	"golang.org/x/net/context"
+	"google.golang.org/grpc/metadata"
 	"github.com/opencord/voltha-go/common/log"
 	// Values generated by the go template
 	{{range .Imports}}
@@ -35,7 +36,7 @@
 
 {{if .Ct}}{{else}}
 type clientCtl struct {
-	send func(string, interface{}, string) error
+	send func(string, context.Context, interface{}, string, metadata.MD) error
 	cncl  context.CancelFunc
 	ctx context.Context
 }
@@ -74,19 +75,23 @@
 // parameter and validate that the response matches the expected
 // value provided. It will return nil if successful or an error
 // if not.
-func {{.Name}}Send(mthd string, param interface{}, expect string) error {
+func {{.Name}}Send(mthd string, ctx context.Context, param interface{},
+					expect string, expectMeta metadata.MD) error {
 	switch mthd {
 	{{range .Methods}}
-		case "{{.Name}}":
+	case "{{.Name}}":
+		var hdr metadata.MD
 		switch t := param.(type) {
-			case *{{.Param}}:
+		case *{{.Param}}:
 	{{if .Ss}}
 			_=t
+			_=hdr
 	{{else if .Cs}}
 			_=t
+			_=hdr
 	{{else}}
 			client := {{.Pkg}}.New{{.Svc}}Client({{$.Name}}Client.conn)
-			res, err := client.{{.Name}}(context.Background(), t)
+			res, err := client.{{.Name}}(ctx, t, grpc.Header(&hdr))
 			if err != nil {
 				return errors.New("Error sending method {{.Name}}")
 			}
@@ -94,13 +99,27 @@
 			// value.
 			if resS,err := json.Marshal(res); err == nil {
 				if string(resS) != expect {
+					resFile.testLog("Unexpected result returned\n")
 					return errors.New("Unexpected result on method {{.Name}}")
 				}
 			} else {
 				return errors.New("Error Marshaling the reply for method {{.Name}}")
 			}
-			default:
-					return errors.New("Invalid parameter type for method {{.Name}}")
+			// Now validate the metadata in the response
+			for k,v := range expectMeta {
+				if rv,ok := hdr[k]; ok == true {
+					if rv[0] != v[0] {
+						resFile.testLog("Mismatch on returned metadata for key '%s' expected '%s' and got '%s'\n", k, v, rv)
+						err = errors.New("Failure on returned metadata")
+					}
+				} else {
+					resFile.testLog("Returned metadata missing key '%s'; expected value '%s' at that key\n", k, v)
+					err = errors.New("Failure on returned metadata")
+				}
+			}
+			return err
+		default:
+			return errors.New("Invalid parameter type for method {{.Name}}")
 	{{end}}
 		}
 	{{end}}