[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)
+}