VOL-1928 Unit test cases for backend.go

Change-Id: I926b3184e9df06ffa06b141f8a003977d0157f73
diff --git a/internal/pkg/afrouter/backend_test.go b/internal/pkg/afrouter/backend_test.go
new file mode 100644
index 0000000..edd584e
--- /dev/null
+++ b/internal/pkg/afrouter/backend_test.go
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package afrouter
+
+// Unit Test Backend manager that handles redundant connections per backend
+
+import (
+	"fmt"
+	"github.com/stretchr/testify/assert"
+	"testing"
+)
+
+func makeBackend() *BackendConfig {
+	var connections []ConnectionConfig
+	connectionConfig := ConnectionConfig{
+		Name: fmt.Sprintf("ro_vcore%d%d", 0, 1),
+		Addr: "foo",
+		Port: "123",
+	}
+	connections = append(connections, connectionConfig)
+
+	backendConfig := BackendConfig{
+		Name:        fmt.Sprintf("ro_vcore%d", 0),
+		Type:        BackendSingleServer,
+		Connections: connections,
+	}
+	return &backendConfig
+}
+
+func makeBackendCluster(numBackends int, numConnections int) *BackendClusterConfig {
+
+	var backends []BackendConfig
+	for backendIndex := 0; backendIndex < numBackends; backendIndex++ {
+		var connections []ConnectionConfig
+		for connectionIndex := 0; connectionIndex < numConnections; connectionIndex++ {
+			connectionConfig := ConnectionConfig{
+				Name: fmt.Sprintf("ro_vcore%d%d", backendIndex, connectionIndex+1),
+				Addr: "foo",
+				Port: "123",
+			}
+			connections = append(connections, connectionConfig)
+		}
+
+		backendConfig := BackendConfig{
+			Name:        fmt.Sprintf("ro_vcore%d", backendIndex),
+			Type:        BackendSingleServer,
+			Connections: connections,
+		}
+
+		backends = append(backends, backendConfig)
+	}
+
+	backendClusterConfig := BackendClusterConfig{
+		Name:     "ro_vcore",
+		Backends: backends,
+	}
+	return &backendClusterConfig
+}
+
+func TestBackend(t *testing.T) {
+
+	backend, err := newBackend(makeBackend(), "Cluster")
+	assert.NotNil(t, backend)
+	assert.Nil(t, err)
+}
+
+func TestBackendInvalidType(t *testing.T) {
+	conf := makeBackend()
+	conf.Type = BackendUndefined
+	backend, err := newBackend(conf, "Cluster")
+	assert.Nil(t, backend)
+	assert.NotNil(t, err, "Backend Invalid Type Undefined")
+}
+
+func TestBackendAssociationLocationMissing(t *testing.T) {
+	conf := makeBackend()
+	conf.Type = BackendActiveActive
+	conf.Association.Location = AssociationLocationUndefined
+	backend, err := newBackend(conf, "Cluster")
+	assert.Nil(t, backend)
+	assert.NotNil(t, err, "An association location must be provided if the backend "+
+		"type is active/active for backend in cluster ")
+}
+
+func TestBackendAssociationFieldMissing(t *testing.T) {
+	conf := makeBackend()
+	conf.Association.Location = AssociationLocationProtobuf
+	conf.Association.Field = ""
+	backend, err := newBackend(conf, "Cluster")
+	assert.Nil(t, backend)
+	assert.NotNil(t, err, "An association field must be provided if the backend "+
+		"type is active/active and the location is set to protobuf "+
+		"for backend in cluster")
+}
+
+func TestBackendAssociationStrategyMissing(t *testing.T) {
+	conf := makeBackend()
+	conf.Association.Strategy = AssociationStrategyUndefined
+	conf.Type = BackendActiveActive
+	backend, err := newBackend(conf, "Cluster")
+	assert.Nil(t, backend)
+	assert.NotNil(t, err, "An association strategy must be provided if the backend "+
+		"type is active/active")
+}
+
+func TestBackendAssociationKeyMissing(t *testing.T) {
+	conf := makeBackend()
+	conf.Association.Key = ""
+	conf.Association.Location = AssociationLocationHeader
+	backend, err := newBackend(conf, "Cluster")
+	assert.Nil(t, backend)
+	assert.NotNil(t, err, "An association key must be provided if the backend "+
+		"type is active/active and the location is set to header "+
+		"for backend in cluster")
+}
+func TestBackendWithMoreConnections(t *testing.T) {
+	conf := makeBackendCluster(1, 4)
+	conf.Backends[0].Association.Location = AssociationLocationHeader
+	conf.Backends[0].Association.Key = "BackendKey"
+	backend, err := newBackend(&conf.Backends[0], "Cluster")
+
+	assert.Nil(t, backend)
+	assert.NotNil(t, err, "Only one connection must be specified if the association "+
+		"strategy is not set to 'active_active'")
+
+}
+func TestBackendNoConnections(t *testing.T) {
+	confZero := makeBackendCluster(1, 0)
+	confZero.Backends[0].Association.Location = AssociationLocationHeader
+	confZero.Backends[0].Association.Key = "BackendKey"
+	backendNoConn, err := newBackend(&confZero.Backends[0], "Cluster")
+
+	assert.Nil(t, backendNoConn)
+	assert.NotNil(t, err, "A connection must have a name for backend in cluster")
+}