VOL-2293, VOL-2456 improve error handling

Change-Id: I4be5f12719a31b40363758cd47cc02968f180c75
diff --git a/adaptercore/device_handler_test.go b/adaptercore/device_handler_test.go
index aacc930..fbb224d 100644
--- a/adaptercore/device_handler_test.go
+++ b/adaptercore/device_handler_test.go
@@ -275,6 +275,36 @@
 	}
 }
 
+func sparseCompare(keys []string, spec, target interface{}) bool {
+	if spec == target {
+		return true
+	}
+	if spec == nil || target == nil {
+		return false
+	}
+	typeSpec := reflect.TypeOf(spec)
+	typeTarget := reflect.TypeOf(target)
+	if typeSpec != typeTarget {
+		return false
+	}
+
+	vSpec := reflect.ValueOf(spec)
+	vTarget := reflect.ValueOf(target)
+	if vSpec.Kind() == reflect.Ptr {
+		vSpec = vSpec.Elem()
+		vTarget = vTarget.Elem()
+	}
+
+	for _, key := range keys {
+		fSpec := vSpec.FieldByName(key)
+		fTarget := vTarget.FieldByName(key)
+		if !reflect.DeepEqual(fSpec.Interface(), fTarget.Interface()) {
+			return false
+		}
+	}
+	return true
+}
+
 func TestDeviceHandler_GetChildDevice(t *testing.T) {
 	dh1 := newMockDeviceHandler()
 	dh2 := negativeDeviceHandler()
@@ -287,49 +317,72 @@
 		devicehandler *DeviceHandler
 		args          args
 		want          *voltha.Device
+		errType       reflect.Type
 	}{
 		{"GetChildDevice-1", dh1,
 			args{parentPort: 1,
 				onuID: 1},
-			&voltha.Device{},
+			&voltha.Device{
+				Id:           "1",
+				ParentId:     "olt",
+				ParentPortNo: 1,
+			},
+			nil,
 		},
 		{"GetChildDevice-2", dh2,
 			args{parentPort: 1,
 				onuID: 1},
-			&voltha.Device{},
+			nil,
+			reflect.TypeOf(&ErrNotFound{}),
 		},
 	}
+
+	/*
+	   --- FAIL: TestDeviceHandler_GetChildDevice/GetChildDevice-1 (0.00s)
+	       device_handler_test.go:309: GetportLabel() => want=(, <nil>) got=(id:"1" parent_id:"olt" parent_port_no:1 proxy_address:<channel_id:1 channel_group_id:1 onu_id:1 > oper_status:ACTIVE connect_status:UNREACHABLE ports:<port_no:1 label:"pon" > ports:<port_no:2 label:"uni" > pm_configs:<id:"olt" default_freq:10 > , <nil>)
+	   --- FAIL: TestDeviceHandler_GetChildDevice/GetChildDevice-2 (0.00s)
+	*/
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			got := tt.devicehandler.GetChildDevice(tt.args.parentPort, tt.args.onuID)
+			got, err := tt.devicehandler.GetChildDevice(tt.args.parentPort, tt.args.onuID)
+			if reflect.TypeOf(err) != tt.errType || !sparseCompare([]string{"Id", "ParentId", "ParentPortNo"}, tt.want, got) {
+				t.Errorf("GetportLabel() => want=(%v, %v) got=(%v, %v)",
+					tt.want, tt.errType, got, reflect.TypeOf(err))
+				return
+			}
 			t.Log("onu device id", got)
 		})
 	}
 }
 
 func TestGetportLabel(t *testing.T) {
+	invalid := reflect.TypeOf(&ErrInvalidValue{})
 	type args struct {
 		portNum  uint32
 		portType voltha.Port_PortType
 	}
 	tests := []struct {
-		name string
-		args args
-		want string
+		name    string
+		args    args
+		want    string
+		errType reflect.Type
 	}{
-		{"GetportLabel-1", args{portNum: 0, portType: 0}, ""},
-		{"GetportLabel-2", args{portNum: 1, portType: 1}, "nni-1"},
-		{"GetportLabel-3", args{portNum: 2, portType: 2}, ""},
-		{"GetportLabel-4", args{portNum: 3, portType: 3}, "pon-3"},
-		{"GetportLabel-5", args{portNum: 4, portType: 4}, ""},
-		{"GetportLabel-6", args{portNum: 5, portType: 5}, ""},
-		{"GetportLabel-7", args{portNum: 6, portType: 6}, ""},
+		{"GetportLabel-1", args{portNum: 0, portType: 0}, "", invalid},
+		{"GetportLabel-2", args{portNum: 1, portType: 1}, "nni-1", nil},
+		{"GetportLabel-3", args{portNum: 2, portType: 2}, "", invalid},
+		{"GetportLabel-4", args{portNum: 3, portType: 3}, "pon-3", nil},
+		{"GetportLabel-5", args{portNum: 4, portType: 4}, "", invalid},
+		{"GetportLabel-6", args{portNum: 5, portType: 5}, "", invalid},
+		{"GetportLabel-7", args{portNum: 6, portType: 6}, "", invalid},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			if got := GetportLabel(tt.args.portNum, tt.args.portType); got != tt.want {
-				t.Errorf("GetportLabel() = %v, want %v", got, tt.want)
+			got, err := GetportLabel(tt.args.portNum, tt.args.portType)
+			if reflect.TypeOf(err) != tt.errType || got != tt.want {
+				t.Errorf("GetportLabel() => want=(%v, %v) got=(%v, %v)",
+					tt.want, tt.errType, got, reflect.TypeOf(err))
 			}
+
 		})
 	}
 }
@@ -366,80 +419,86 @@
 	type args struct {
 		msg *ic.InterAdapterMessage
 	}
+	invalid := reflect.TypeOf(&ErrInvalidValue{})
 	tests := []struct {
 		name    string
 		args    args
-		wantErr bool
+		wantErr reflect.Type
 	}{
 		{"ProcessInterAdapterMessage-1", args{msg: &ic.InterAdapterMessage{
 			Header: &ic.InterAdapterHeader{
 				Id:   "012345",
-				Type: 0,
+				Type: ic.InterAdapterMessageType_FLOW_REQUEST,
 			},
 			Body: marshalledData,
-		}}, false},
+		}}, invalid},
 		{"ProcessInterAdapterMessage-2", args{msg: &ic.InterAdapterMessage{
 			Header: &ic.InterAdapterHeader{
 				Id:   "012345",
-				Type: 1,
+				Type: ic.InterAdapterMessageType_FLOW_RESPONSE,
 			},
 			Body: marshalledData1,
-		}}, false},
+		}}, invalid},
 		{"ProcessInterAdapterMessage-3", args{msg: &ic.InterAdapterMessage{
 			Header: &ic.InterAdapterHeader{
 				Id:   "012345",
-				Type: 2,
+				Type: ic.InterAdapterMessageType_OMCI_REQUEST,
 			},
 			Body: marshalledData,
-		}}, false},
+		}}, reflect.TypeOf(&ErrCommunication{})},
 		{"ProcessInterAdapterMessage-4", args{msg: &ic.InterAdapterMessage{
 			Header: &ic.InterAdapterHeader{
 				Id:   "012345",
-				Type: 3,
+				Type: ic.InterAdapterMessageType_OMCI_RESPONSE,
 			}, Body: marshalledData,
-		}}, false},
+		}}, invalid},
 		{"ProcessInterAdapterMessage-5", args{msg: &ic.InterAdapterMessage{
 			Header: &ic.InterAdapterHeader{
 				Id:   "012345",
-				Type: 4,
+				Type: ic.InterAdapterMessageType_METRICS_REQUEST,
 			}, Body: marshalledData1,
-		}}, false},
+		}}, invalid},
 		{"ProcessInterAdapterMessage-6", args{msg: &ic.InterAdapterMessage{
 			Header: &ic.InterAdapterHeader{
 				Id:   "012345",
-				Type: 4,
+				Type: ic.InterAdapterMessageType_METRICS_RESPONSE,
 			}, Body: marshalledData,
-		}}, false},
+		}}, invalid},
 		{"ProcessInterAdapterMessage-7", args{msg: &ic.InterAdapterMessage{
 			Header: &ic.InterAdapterHeader{
 				Id:   "012345",
-				Type: 5,
+				Type: ic.InterAdapterMessageType_ONU_IND_REQUEST,
 			}, Body: marshalledData,
-		}}, false},
+		}}, invalid},
 		{"ProcessInterAdapterMessage-8", args{msg: &ic.InterAdapterMessage{
 			Header: &ic.InterAdapterHeader{
 				Id:   "012345",
-				Type: 6,
+				Type: ic.InterAdapterMessageType_ONU_IND_RESPONSE,
 			}, Body: marshalledData,
-		}}, false},
+		}}, invalid},
 		{"ProcessInterAdapterMessage-9", args{msg: &ic.InterAdapterMessage{
 			Header: &ic.InterAdapterHeader{
 				Id:   "012345",
-				Type: 7,
+				Type: ic.InterAdapterMessageType_TECH_PROFILE_DOWNLOAD_REQUEST,
 			}, Body: marshalledData,
-		}}, false},
+		}}, invalid},
 		{"ProcessInterAdapterMessage-10", args{msg: &ic.InterAdapterMessage{
 			Header: &ic.InterAdapterHeader{
 				Id:   "012345",
-				Type: 7,
+				Type: ic.InterAdapterMessageType_DELETE_GEM_PORT_REQUEST,
 			}, Body: marshalledData2,
-		}}, false},
-		//marshalledData2
+		}}, invalid},
+		{"ProcessInterAdapterMessage-11", args{msg: &ic.InterAdapterMessage{
+			Header: &ic.InterAdapterHeader{
+				Id:   "012345",
+				Type: ic.InterAdapterMessageType_DELETE_TCONT_REQUEST,
+			}, Body: marshalledData2,
+		}}, invalid},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 
-			if err := dh.ProcessInterAdapterMessage(tt.args.msg); (err != nil) != tt.wantErr {
+			if err := dh.ProcessInterAdapterMessage(tt.args.msg); reflect.TypeOf(err) != tt.wantErr {
 				t.Errorf("DeviceHandler.ProcessInterAdapterMessage() error = %v, wantErr %v", err, tt.wantErr)
 			}
 		})