[VOL-4290] Voltha go library updates for gRPC migration

Change-Id: I1aa2774beb6b7ed7419bc45aeb53fcae8a8ecda0
diff --git a/pkg/grpc/utils_test.go b/pkg/grpc/utils_test.go
new file mode 100644
index 0000000..55ffdf8
--- /dev/null
+++ b/pkg/grpc/utils_test.go
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2021-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 grpc
+
+import (
+	"context"
+	"os"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestBackoffNoWait(t *testing.T) {
+	initTime := 1 * time.Millisecond
+	maxTime := 500 * time.Millisecond
+	maxElapsedTime := 0 * time.Millisecond
+	backoff := NewBackoff(initTime, maxTime, maxElapsedTime)
+	ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
+	defer cancel()
+	err := backoff.Backoff(ctx)
+	assert.Nil(t, err)
+}
+
+func TestBackoffElapsedTime(t *testing.T) {
+	initTime := 10 * time.Millisecond
+	maxTime := 50 * time.Millisecond
+	maxElapsedTime := 500 * time.Millisecond
+	b := NewBackoff(initTime, maxTime, maxElapsedTime)
+	start := time.Now()
+loop:
+	for {
+		err := b.Backoff(context.Background())
+		if err != nil {
+			break loop
+		}
+	}
+	assert.GreaterOrEqual(t, time.Since(start).Milliseconds(), maxTime.Milliseconds())
+}
+
+func TestBackoffSuccess(t *testing.T) {
+	initTime := 100 * time.Millisecond
+	maxTime := 500 * time.Millisecond
+	maxElapsedTime := 0 * time.Millisecond
+	backoff := NewBackoff(initTime, maxTime, maxElapsedTime)
+	ctx, cancel := context.WithTimeout(context.Background(), 2000*time.Millisecond)
+	defer cancel()
+	previous := time.Duration(0)
+	for i := 1; i < 5; i++ {
+		start := time.Now()
+		err := backoff.Backoff(ctx)
+		assert.Nil(t, err)
+		current := time.Since(start)
+		if current < maxTime {
+			assert.GreaterOrEqual(t, current.Milliseconds(), previous.Milliseconds())
+		}
+		previous = current
+	}
+}
+
+func TestBackoffContextTimeout(t *testing.T) {
+	initTime := 1000 * time.Millisecond
+	maxTime := 1100 * time.Millisecond
+	maxElapsedTime := 0 * time.Millisecond
+	backoff := NewBackoff(initTime, maxTime, maxElapsedTime)
+	ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
+	defer cancel()
+	err := backoff.Backoff(ctx)
+	assert.NotNil(t, err)
+	assert.Equal(t, context.DeadlineExceeded, err)
+}
+
+func TestSetFromEnvVariable(t *testing.T) {
+	// 1. Test with unsupported type
+	var valInt int
+	err := SetFromEnvVariable("MY-KEY", valInt)
+	assert.NotNil(t, err)
+
+	//2. Test with supported type but no env variable present
+	var valDuration time.Duration
+	err = SetFromEnvVariable("MY-KEY", &valDuration)
+	assert.Nil(t, err)
+
+	//3. Test with supported type and env variable present
+	err = os.Setenv("MY-KEY", "10s")
+	assert.Nil(t, err)
+	err = SetFromEnvVariable("MY-KEY", &valDuration)
+	assert.Nil(t, err)
+	assert.Equal(t, 10*time.Second, valDuration)
+}